JwtAuthExtension.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using TEAMModelOS.SDK.Extension.JwtAuth.Models;
  2. using IdentityModel;
  3. using Microsoft.AspNetCore.Authentication.JwtBearer;
  4. using Microsoft.AspNetCore.Authorization;
  5. using Microsoft.Extensions.Configuration;
  6. using Microsoft.Extensions.DependencyInjection;
  7. using Microsoft.IdentityModel.Tokens;
  8. using System;
  9. using System.Threading.Tasks;
  10. using TEAMModelOS.SDK.Context.Configuration;
  11. using TEAMModelOS.SDK.Helper.Security.RSACrypt;
  12. using TEAMModelOS.SDK.Extension.JwtAuth.Filters;
  13. namespace TEAMModelOS.SDK.Extension.JwtAuth
  14. {
  15. public static class JwtAuthExtension
  16. {
  17. public static void JwtAuth(this IServiceCollection services , IConfigurationSection configuration)
  18. {
  19. services.Configure<JwtSetting>(configuration);
  20. // var creds = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["SecurityKey"]), SecurityAlgorithms.RsaSha256Signature);
  21. //var creds = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["SecurityKey"]));
  22. string path = BaseConfigModel.ContentRootPath;
  23. // RsaSecurityKey creds = new RsaSecurityKey(RsaHelper.LoadCertificateFile(path + "/private.pem"));
  24. SecurityKey creds = RsaHelper.GenerateValidationKey(path + "/public.pem");
  25. //RsaSecurityKey creds = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["SecurityKey"])), SecurityAlgorithms.RsaSha256Signature);
  26. // 令牌验证参数
  27. var tokenValidationParameters = new TokenValidationParameters
  28. {
  29. NameClaimType = JwtClaimTypes.Name,
  30. RoleClaimType = JwtClaimTypes.Role,
  31. ValidateIssuerSigningKey = true,
  32. IssuerSigningKey = creds,
  33. ValidateIssuer = true,
  34. ValidIssuer = configuration["Issuer"],//发行人
  35. ValidateAudience = true,
  36. ValidAudience = configuration["Audience"],//订阅人
  37. // 是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比
  38. ValidateLifetime = true,
  39. //允许的服务器时间偏移量
  40. ClockSkew = TimeSpan.Zero,
  41. //是否要求Token的Claims中必须包含Expires
  42. RequireExpirationTime = true,
  43. };
  44. services.AddAuthentication(x => {
  45. x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
  46. x.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
  47. x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  48. }).AddJwtBearer(o =>
  49. {
  50. ///https://blog.csdn.net/sinat_14899485/article/details/88591848 jwt 黑名单
  51. //o.SecurityTokenValidators.Clear();
  52. o.SecurityTokenValidators.Add(new BlackListJwtSecurityTokenHandler()); /// 自定义黑名单拦截
  53. o.TokenValidationParameters = tokenValidationParameters;
  54. o.Events = new JwtBearerEvents
  55. {
  56. OnAuthenticationFailed = context =>
  57. {
  58. // 如果过期,则把<是否过期>添加到,返回头信息中
  59. if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
  60. {
  61. context.Response.Headers.Add("Token-Expired", "true");
  62. }
  63. return Task.CompletedTask;
  64. },
  65. //Url中添加access_token=[token],直接在浏览器中访问
  66. OnMessageReceived = context => {
  67. context.Token = context.Request.Query["access_token"];
  68. return Task.CompletedTask;
  69. },
  70. //URL未授权调用
  71. OnChallenge = context => {
  72. return Task.CompletedTask;
  73. },
  74. //在Token验证通过后调用
  75. OnTokenValidated = context => {
  76. //编写业务
  77. return Task.CompletedTask;
  78. },
  79. };
  80. });
  81. if (services == null) throw new ArgumentNullException(nameof(services));
  82. // 1【授权】、这个和上边的异曲同工,好处就是不用在controller中,写多个 roles 。
  83. // 然后这么写 [Authorize(Policy = "Admin")]
  84. services.AddAuthorization(options =>
  85. {
  86. //options.AddPolicy(Constant.Role_Root, policy => policy.RequireRole("root").Build());
  87. //options.AddPolicy(Constant.Role_Admin, policy => policy.RequireRole("admin").Build());
  88. //options.AddPolicy(Constant.Role_Lecturer, policy => policy.RequireRole("lecturer").Build());
  89. //options.AddPolicy(Constant.Role_Learner, policy => policy.RequireRole("learner").Build());
  90. //options.AddPolicy(Constant.Role_RootAdmin, policy => policy.RequireRole("root", "admin").Build());
  91. //options.AddPolicy(Constant.Role_WebAll, policy => policy.RequireRole("root", "admin", "lecturer").Build());
  92. //options.AddPolicy(Constant.Role_LecturerLearner, policy => policy.RequireRole("lecturer", "learner").Build());
  93. });
  94. }
  95. }
  96. }