JwtHelper.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using Microsoft.IdentityModel.Tokens;
  2. using System.IdentityModel.Tokens.Jwt;
  3. using System.Security.Claims;
  4. namespace VberZero.Jwt
  5. {
  6. public static class JwtHelper
  7. {
  8. public static string CreateAccessToken(ClaimsIdentity identity, TokenAuthConfiguration configuration, TimeSpan? expiration = null)
  9. {
  10. return CreateAccessToken(CreateJwtClaims(identity), configuration, expiration);
  11. }
  12. public static string CreateAccessToken(IEnumerable<Claim> claims, TokenAuthConfiguration configuration, TimeSpan? expiration = null)
  13. {
  14. var now = DateTime.UtcNow;
  15. var jwtSecurityToken = new JwtSecurityToken(
  16. issuer: configuration.Issuer,
  17. audience: configuration.Audience,
  18. claims: claims,
  19. notBefore: now,
  20. expires: now.Add(expiration ?? configuration.Expiration),
  21. signingCredentials: configuration.SigningCredentials
  22. );
  23. return new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);
  24. }
  25. private static List<Claim> CreateJwtClaims(ClaimsIdentity identity)
  26. {
  27. var claims = identity.Claims.ToList();
  28. var nameIdClaim = claims.First(c => c.Type == ClaimTypes.NameIdentifier);
  29. // Specifically add the jti (random nonce), iat (issued timestamp), and sub (subject/user) claims.
  30. claims.AddRange(new[]
  31. {
  32. new Claim(JwtRegisteredClaimNames.Sub, nameIdClaim.Value),
  33. new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
  34. new Claim(JwtRegisteredClaimNames.Iat, DateTimeOffset.Now.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64)
  35. });
  36. return claims;
  37. }
  38. //public static ClaimsPrincipal ReadJwtToken(string token)
  39. //{
  40. // var validateParameter = new TokenValidationParameters()
  41. // {
  42. // ValidateLifetime = false,
  43. // ValidateAudience = false,
  44. // ValidateIssuer = false,
  45. // ValidateIssuerSigningKey = false,
  46. // };
  47. // ClaimsPrincipal principal =
  48. // new JwtSecurityTokenHandler().ValidateToken(token, validateParameter, out var securityToken);
  49. // return principal;
  50. //}
  51. /// <summary>
  52. /// 校验token
  53. /// </summary>
  54. /// <param name="token"></param>
  55. /// <param name="configuration"></param>
  56. /// <param name="principal"></param>
  57. /// <param name="jwtPayload"></param>
  58. /// <returns></returns>
  59. public static bool VerifyJwtToken(string token, TokenAuthConfiguration configuration, out ClaimsPrincipal principal, out string jwtPayload)
  60. {
  61. principal = null;
  62. jwtPayload = null;
  63. //校验token
  64. var validateParameter = new TokenValidationParameters()
  65. {
  66. ValidateLifetime = true,
  67. ValidateAudience = true,
  68. ValidateIssuer = true,
  69. ValidateIssuerSigningKey = true,
  70. ValidIssuer = configuration.Issuer,
  71. ValidAudience = configuration.Audience,
  72. IssuerSigningKey = configuration.SecurityKey,
  73. ClockSkew = TimeSpan.Zero//校验过期时间必须加此属性
  74. };
  75. //不校验,直接解析token
  76. //jwtToken = new JwtSecurityTokenHandler().ReadJwtToken(token1);
  77. bool success;
  78. try
  79. {
  80. //校验并解析token,validatedToken是解密后的对象
  81. principal = new JwtSecurityTokenHandler().ValidateToken(token, validateParameter, out SecurityToken validatedToken);
  82. //获取payload中的数据
  83. jwtPayload = ((JwtSecurityToken)validatedToken).Payload.SerializeToJson();
  84. success = true;
  85. }
  86. catch (SecurityTokenExpiredException ex)
  87. {
  88. //表示过期
  89. success = false;
  90. }
  91. catch (SecurityTokenException ex)
  92. {
  93. //表示token错误
  94. success = false;
  95. }
  96. catch (Exception ex)
  97. {
  98. success = false;
  99. }
  100. return success;
  101. }
  102. }
  103. }