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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章