JwtHelper.cs 4.5 KB

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