Asp.NetCore安全驗證之JWT


   本文只是介紹了下基於AspNetCore自帶的System.IdentityModel.Tokens.Jwt.dll工具在項目中Token的應用。

我這里談到的很淺顯就兩點:

一,超時時間

二,數據的加載

1,廢話不多說上代碼,首先是自定義的載體類如下

1   public class DtoRecLogin
2     {
3         public string Data1 { get; set; }
4         public string Data2 { get; set; }
5         public string Data3 { get; set; }
6     }

2,接着是Token生成的簽名信息

public class TokenAuthOption
    {
        public static string Audience { get; } = "ExampleAudience";
        public static string Issuer { get; } = "ExampleIssuer";
        public static RsaSecurityKey Key { get; } = new RsaSecurityKey(RSAKeyHelper.GenerateKey());
        public static SigningCredentials SigningCredentials { get; } = new SigningCredentials(Key, SecurityAlgorithms.RsaSha256Signature);

        public static TimeSpan ExpiresSpan { get; } = TimeSpan.FromMinutes(1440);
    }

3,好了准備工作完成接着貼上生成Token的代碼

 1 private static string GenerateToken(DtoRecLogin reclogin, DateTime expires)
 2         {
 3             var handler = new JwtSecurityTokenHandler();
 4 
 5             ClaimsIdentity identity = new ClaimsIdentity(
 6                 new GenericIdentity(reclogin.Data1, "TokenAuth"),
 7                 new[] {
 8             new Claim("ID", reclogin.Data2),
 9             new Claim("SysCode",reclogin.Data3)
10                 }
11             );
12 
13             var securityToken = handler.CreateToken(new SecurityTokenDescriptor
14             {
15                 Issuer = TokenAuthOption.Issuer,
16                 Audience = TokenAuthOption.Audience,
17                 SigningCredentials = TokenAuthOption.SigningCredentials,
18                 Subject = identity,
19                 Expires = expires
20             });
21             return handler.WriteToken(securityToken);
22         }

這個方法有2個參數

1)DtoRecLogin對象用於承載需要傳遞的信息

2)  expires 是Token的超時時間

4,Token生成完畢我們來模擬下調用和解析Token

 

 public static void Main(string[] args)
        {
            #region 生成Token
            var timeout = DateTime.Now + TimeSpan.FromSeconds(5);
            var token = GenerateToken(new DtoRecLogin()
            {
                Data1 = "TestData1",
                Data2 = "TestData2",
                Data3 = "TestData3"
            }, timeout);
            #endregion


            #region 解析Token
            //當前的時間戳用於判斷token是否過期
            var now = Math.Round((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds);

            var encodedJwt = new JwtSecurityTokenHandler().ReadJwtToken(token);
            //開始時間
            var iat = Convert.ToDouble(encodedJwt.Claims.FirstOrDefault(u => u.Type == "iat").Value);
            //結束時間
            var exp = Convert.ToDouble(encodedJwt.Claims.FirstOrDefault(u => u.Type == "exp").Value);

            //如果當前時間戳不再Token聲明周期范圍內,則返回Token過期
            if (!(iat < now && now < exp))
            {
                throw (new Exception() { Source = "TokenTimeOut" });
            }

            var data1 = encodedJwt.Claims.FirstOrDefault(u => u.Type == "unique_name").Value;
            var data2 = encodedJwt.Claims.FirstOrDefault(u => u.Type == "ID").Value;
            var data3 = encodedJwt.Claims.FirstOrDefault(u => u.Type == "SysCode").Value;
            #endregion

           
        }

 

注釋的很詳細就不多說了,為了方便的測試我用了5秒鍾超時,在調試的時候 可以在

 var now = Math.Round((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds);
打上斷點,然后一次直接跳過此處,一次等待5秒以上在往下走,可以發現超過5秒會拋Token過期異常

好了,到此結束,希望可以幫到剛接觸Token驗證的朋友。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM