石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加密与解密方法:`#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
转载随意注明出处