JwtHelper.cs 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using CMS.Context;
  2. using CMS.Extension.Jwt;
  3. using IdentityModel;
  4. using Microsoft.Extensions.Configuration;
  5. using Microsoft.IdentityModel.Tokens;
  6. using Newtonsoft.Json.Linq;
  7. using System;
  8. using System.Collections;
  9. using System.Collections.Generic;
  10. using System.IdentityModel.Tokens.Jwt;
  11. using System.Linq;
  12. using System.Security.Claims;
  13. using System.Security.Cryptography;
  14. using System.Threading.Tasks;
  15. using TEAMModelOS.SDK.Extension.JwtAuth.Models;
  16. using TEAMModelOS.SDK.Helper.Common.JsonHelper;
  17. using TEAMModelOS.SDK.Helper.Security.RSACrypt;
  18. namespace HiTeachCE.Extension
  19. {
  20. public class JwtHelper
  21. {
  22. /// <summary>
  23. /// 颁发JWT Token
  24. /// </summary>
  25. /// <param name="claimModel"></param>
  26. /// <param name="tokenModel"></param>
  27. /// <returns></returns>
  28. public static JwtResponse IssueJWT(ClaimModel claimModel)
  29. {
  30. // JwtClient jwtClient = null;
  31. Extension.JwtSetting setting = BaseConfigModel.Configuration.GetSection("JwtSetting").Get<Extension.JwtSetting>();
  32. JwtClient jwtClient = setting.JwtClient.Where(x => x.Name.Equals(claimModel.Scope)).First();
  33. //foreach (JwtClient client in setting.JwtClient) {
  34. // if (claimModel.Scope.Equals(client.Name)) {
  35. // jwtClient = client;
  36. // break;
  37. // }
  38. //}
  39. List<Claim> claims = new List<Claim>();
  40. var dateTime = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();
  41. claims.AddRange(claimModel.Claims);
  42. claims.Add(new Claim(JwtClaimTypes.IssuedAt, dateTime + "", ClaimValueTypes.Integer64));
  43. claims.Add(new Claim(JwtClaimTypes.NotBefore, dateTime + "", ClaimValueTypes.Integer64));
  44. claims.Add(new Claim(JwtClaimTypes.Expiration, dateTime + jwtClient.Exp + "", ClaimValueTypes.Integer64));
  45. claims.Add(new Claim(JwtClaimTypes.Audience, setting.Audience));
  46. claims.Add(new Claim(JwtClaimTypes.Issuer, setting.Issuer));
  47. claims.Add(new Claim(JwtClaimTypes.Scope, claimModel.Scope));
  48. claims.Add(new Claim(JwtClaimTypes.JwtId, Guid.NewGuid().ToString()));
  49. //claims.AddRange(claimModel.Roles.Select(s=>new Claim(JwtClaimTypes.Role, s)));
  50. //claims.AddRange(claimModel.Claims.Select(s => new Claim(ClaimTypes.Role, s)));
  51. string path = BaseConfigModel.ContentRootPath;
  52. var creds = RsaHelper.GenerateSigningCredentials(path + "/private.pem");
  53. var jwt = new JwtSecurityToken(
  54. issuer: setting.Issuer,
  55. claims: claims,
  56. signingCredentials: creds
  57. );
  58. var jwtHandler = new JwtSecurityTokenHandler();
  59. return new JwtResponse
  60. {
  61. // Token_type = "Bearer",
  62. Access_token = jwtHandler.WriteToken(jwt),
  63. Scope = claimModel.Scope
  64. };
  65. }
  66. /// <summary>
  67. /// 解析jwt
  68. /// </summary>
  69. /// <param name="jwtStr"></param>
  70. /// <returns></returns>
  71. public static ClaimModel SerializeJWT(string jwtStr)
  72. {
  73. ///https://www.cnblogs.com/JacZhu/p/6837676.html#Update2.0 刷新 用户的 Token 在过期时间之内根本无法手动设置失效,随之而来的还有重放攻击等等问题
  74. var jwtHandler = new JwtSecurityTokenHandler();
  75. if (string.IsNullOrEmpty(jwtStr))
  76. {
  77. return null;
  78. }
  79. JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(jwtStr);
  80. jwtToken.Payload.TryGetValue(JwtClaimTypes.Role, out object role);
  81. ClaimModel claimModel = new ClaimModel();
  82. Dictionary<string, object> claimDict = new Dictionary<string, object>();
  83. foreach (Claim claim in jwtToken.Claims)
  84. {
  85. claimDict.TryAdd(claim.Type, claim.Value);
  86. }
  87. claimDict[JwtClaimTypes.Role] = role;
  88. claimModel.Claim = claimDict;
  89. claimModel.Claims = jwtToken.Claims.ToList();
  90. return claimModel;
  91. }
  92. }
  93. }