WebApi学习2:Token的理解和用法

石NANA学习之路https://blog.csdn.net/weixin_44352179

WebApi学习2:Token的理解和用法

第一次使用Token基于令牌的身份验证,想把对于Token的理解和使用心得分享给大家,文章不足之处还望海涵!
如何创建一个Web Api项目

Token验证

我们知道WEB网站的身份验证一般通过session或者cookie完成的,登录成功后客户端发送的任何请求都带上cookie,服务端根据客户端发送来的cookie来识别用户。
Web Api出现了更好的验证形式,于是就有了基于令牌的认证,使用令牌认证的可扩展性和易移动终端调用等等好处。最重要的是别人都用上了,你还有理由不用吗?

我们需要知道token机制,基于Token的验证流程一般是这样的:

  • 我们在登录时都会从客户端发送用户名和密码等请求到服务端
  • 服务端接收到请求后,验证请求是否正确;
  • 请求验证成功后,服务端会生成一个Token令牌,一般请求为:《Token+参数签名+时间戳 》 这三个系统参数来办证请求的有效性。Token一般存储在数据库或缓存中,方便后期对请求的验证,然后把生成的Token发送到客户端。
  • 客户端收到Token令牌后,将其存储在缓存中
  • 客户端每次发送请求到服务端获取数据时都带上Token
  • 请求验证成功就向客户端返回数据。

Token一般会带上时间戳,请求设置过期时间,验证token的时候同时验证是否过期,并告知客户端。客户端接收到token令牌过期的返回后,则要求用户重新输入用户名跟密码,进行登录请求验证。验证成功后可继续发送请求。

【简单介绍为:之所以要加token来发送请求接收数据,是因为没有令牌,别人可以随意请求获取到数据。为了保障数据的安全性和保密性。Token就是把特定的参数加密避免明文传输,每次发送请求带上Token由服务端进行验证Token解密后的参数是否与原始生成的参数是否一致。】

RSA加密与解密、签名与认证

RSA加密是非对称加密方式。
RSA加密解密图解
RSA加密与解密方法:`#region RSA 加密解密
#region RSA 的密钥产生
///
/// RSA产生密钥
///
/// 私钥
/// 公钥
public static void RSAKey(out string xmlKeys, out string xmlPublicKey)
{
try
{
System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
xmlKeys = rsa.ToXmlString(true);
xmlPublicKey = rsa.ToXmlString(false);
}
catch (Exception ex)
{
throw ex;
}
}
#endregion

    #region RSA加密函数
    //############################################################################## 
    //RSA 方式加密 
    //KEY必须是XML的形式,返回的是字符串 
    //该加密方式有长度限制的!
    //############################################################################## 

    /// <summary>
    /// RSA的加密函数
    /// </summary>
    /// <param name="xmlPublicKey">公钥</param>
    /// <param name="encryptString">待加密的字符串</param>
    /// <returns></returns>
    public static string RSAEncrypt(string xmlPublicKey, string encryptString)
    {
        try
        {
            byte[] PlainTextBArray;
            byte[] CypherTextBArray;
            string Result;
            System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(xmlPublicKey);
            PlainTextBArray = (new UnicodeEncoding()).GetBytes(encryptString);
            CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);
            Result = Convert.ToBase64String(CypherTextBArray);
            return Result;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    /// <summary>
    /// RSA的加密函数 
    /// </summary>
    /// <param name="xmlPublicKey">公钥</param>
    /// <param name="EncryptString">待加密的字节数组</param>
    /// <returns></returns>
    public   string RSAEncrypt(string xmlPublicKey, byte[] EncryptString)
    {
        try
        {
            byte[] CypherTextBArray;
            string Result;
            System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(xmlPublicKey);
            CypherTextBArray = rsa.Encrypt(EncryptString, false);
            Result = Convert.ToBase64String(CypherTextBArray);
            return Result;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    #endregion

    #region RSA的解密函数        
    /// <summary>
    /// RSA的解密函数
    /// </summary>
    /// <param name="xmlPrivateKey">私钥</param>
    /// <param name="decryptString">待解密的字符串</param>
    /// <returns></returns>
    public static string RSADecrypt(string xmlPrivateKey, string decryptString)
    {
        try
        {
            byte[] PlainTextBArray;
            byte[] DypherTextBArray;
            string Result;
            System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(xmlPrivateKey);
            PlainTextBArray = Convert.FromBase64String(decryptString);
            DypherTextBArray = rsa.Decrypt(PlainTextBArray, false);
            Result = (new UnicodeEncoding()).GetString(DypherTextBArray);
            return Result;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    /// <summary>
    /// RSA的解密函数 
    /// </summary>
    /// <param name="xmlPrivateKey">私钥</param>
    /// <param name="DecryptString">待解密的字节数组</param>
    /// <returns></returns>
    public string RSADecrypt(string xmlPrivateKey, byte[] DecryptString)
    {
        try
        {
            byte[] DypherTextBArray;
            string Result;
            System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(xmlPrivateKey);
            DypherTextBArray = rsa.Decrypt(DecryptString, false);
            Result = (new UnicodeEncoding()).GetString(DypherTextBArray);
            return Result;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
#endregion
#endregion`

每次请求都会带上加密后的Token,验证是否正确:


        [HttpGet]
        public string run(string  type,string token)
        {
            var Tokens= Db.Userinfo.FirstOrDefault(u => u.Account ==  RSAToken.RSADecrypt(shi, token));
            //验证token是否正确
            if (Tokens!= null)
            {
                //返回数据
            }
            else
            {
                //非法请求
            }
		}

写到这里相信你对Web Api Token有了一定的了解了吧!
只有学习才能收获,加油!
作者:石shi
转载随意注明出处

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值