石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
轉載隨意註明出處