JwtHelper.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. namespace TEAMModelOS.SDK.Extension.JwtAuth.JwtHelper
  12. {
  13. public class JwtHelper
  14. {
  15. /// <summary>
  16. /// 颁发JWT Token
  17. /// </summary>
  18. /// <param name="claimModel"></param>
  19. /// <param name="tokenModel"></param>
  20. /// <returns></returns>
  21. public static JwtResponse IssueJWT(ClaimModel claimModel, JwtSetting setting)
  22. {
  23. // JwtClient jwtClient = null;
  24. JwtClient jwtClient= setting.JwtClient.Where(x => x.Name.Equals(claimModel.Scope)).First();
  25. //foreach (JwtClient client in setting.JwtClient) {
  26. // if (claimModel.Scope.Equals(client.Name)) {
  27. // jwtClient = client;
  28. // break;
  29. // }
  30. //}
  31. List<Claim> claims = new List<Claim>();
  32. var dateTime = DateTimeHelper.ConvertToTimeStamp10(DateTime.Now);
  33. claims.AddRange(claimModel.Claims);
  34. claims.Add(new Claim(JwtClaimTypes.IssuedAt, dateTime + "", ClaimValueTypes.Integer64));
  35. claims.Add(new Claim(JwtClaimTypes.NotBefore, dateTime + "", ClaimValueTypes.Integer64));
  36. claims.Add(new Claim(JwtClaimTypes.Expiration, dateTime + jwtClient.Exp + "", ClaimValueTypes.Integer64));
  37. claims.Add(new Claim(JwtClaimTypes.Audience, setting.Audience));
  38. claims.Add(new Claim(JwtClaimTypes.Issuer, setting.Issuer));
  39. claims.Add(new Claim(JwtClaimTypes.Scope, claimModel.Scope));
  40. claims.AddRange(claimModel.Roles.ToArray().Select(s=>new Claim(JwtClaimTypes.Role,s)));
  41. var creds = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecurityKey)), SecurityAlgorithms.HmacSha512);
  42. var jwt = new JwtSecurityToken(
  43. claims:claims,
  44. signingCredentials:creds
  45. );
  46. var jwtHandler = new JwtSecurityTokenHandler();
  47. jwtHandler.WriteToken(jwt);
  48. return new JwtResponse {
  49. access_token = jwtHandler.WriteToken(jwt),
  50. scope = claimModel.Scope
  51. };
  52. }
  53. /// <summary>
  54. /// 解析jwt
  55. /// </summary>
  56. /// <param name="jwtStr"></param>
  57. /// <returns></returns>
  58. public static ClaimModel SerializeJWT(string jwtStr)
  59. {
  60. var jwtHandler = new JwtSecurityTokenHandler();
  61. JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(jwtStr);
  62. ClaimModel claimModel = new ClaimModel();
  63. object role = new object();
  64. claimModel.Claims = jwtToken.Claims.ToList();
  65. jwtToken.Payload.TryGetValue("role", out role);
  66. if(role!=null)claimModel.Roles=role.ToString().Split(",").ToList();
  67. return claimModel;
  68. }
  69. }
  70. }