本文只是介紹了下基於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驗證的朋友。