注册认证服务

  • 在这里,我们用微软给我们提供的JwtBearer认证方式,实现认证服务注册 。
  1. 引入nuget包:Microsoft.AspNetCore.Authentication.JwtBearer
  • 注册服务,将服务添加到容器中
  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddControllers();
  4. var Issurer = "JWTBearer.Auth"; //发行人
  5. var Audience = "api.auth"; //受众人
  6. var secretCredentials = "q2xiARx$4x3TKqBJ"; //密钥
  7. //配置认证服务
  8. services.AddAuthentication(x =>
  9. {
  10. x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
  11. x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  12. }).AddJwtBearer(o=>{
  13. o.TokenValidationParameters = new TokenValidationParameters
  14. {
  15. //是否验证发行人
  16. ValidateIssuer = true,
  17. ValidIssuer = Issurer,//发行人
  18. //是否验证受众人
  19. ValidateAudience = true,
  20. ValidAudience = Audience,//受众人
  21. //是否验证密钥
  22. ValidateIssuerSigningKey = true,
  23. IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretCredentials)),
  24. ValidateLifetime = true, //验证生命周期
  25. RequireExpirationTime = true, //过期时间
  26. };
  27. });
  28. }
  • 注意说明:
  1. 一. TokenValidationParameters的参数默认值:
  2. 1. ValidateAudience = true, ----- 如果设置为false,则不验证Audience受众人
  3. 2. ValidateIssuer = true , ----- 如果设置为false,则不验证Issuer发布人,但建议不建议这样设置
  4. 3. ValidateIssuerSigningKey = false,
  5. 4. ValidateLifetime = true, ----- 是否验证Token有效期,使用当前时间与TokenClaims中的NotBeforeExpires对比
  6. 5. RequireExpirationTime = true, ----- 是否要求TokenClaims中必须包含Expires
  7. 6. ClockSkew = TimeSpan.FromSeconds(300), ----- 允许服务器时间偏移量300秒,即我们配置的过期时间加上这个允许偏移的时间值

调用方法,配置Http请求管道

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. app.UseRouting();
  8. //1.先开启认证
  9. app.UseAuthentication();
  10. //2.再开启授权
  11. app.UseAuthorization();
  12. app.UseEndpoints(endpoints =>
  13. {
  14. endpoints.MapControllers();
  15. });
  16. }
  • 在JwtBearerOptions的配置中,通常IssuerSigningKey(签名秘钥), ValidIssuer(Token颁发机构), ValidAudience(颁发给谁) 三个参数是必须的,后两者用于与TokenClaims中的Issuer和Audience进行对比,不一致则验证失败

接口资源保护

  1. [ApiController]
  2. [Route("[controller]")]
  3. [Authorize]
  4. public class WeatherForecastController : ControllerBase
  5. {
  6. private static readonly string[] Summaries = new[]
  7. {
  8. "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
  9. };
  10. private readonly ILogger<WeatherForecastController> _logger;
  11. public WeatherForecastController(ILogger<WeatherForecastController> logger)
  12. {
  13. _logger = logger;
  14. }
  15. [HttpGet]
  16. public IEnumerable<WeatherForecast> Get()
  17. {
  18. var rng = new Random();
  19. return Enumerable.Range(1, 5).Select(index => new WeatherForecast
  20. {
  21. Date = DateTime.Now.AddDays(index),
  22. TemperatureC = rng.Next(-20, 55),
  23. Summary = Summaries[rng.Next(Summaries.Length)]
  24. })
  25. .ToArray();
  26. }
  27. }

生成Token

运行

  • 访问获取Token方法,获取得到access_token net - 图1

  • 再访问,授权资源接口,可以发现,再没有添加请求头token值的情况下,返回了401没有权限 net - 图2

  • 这次,在请求头通过Authorization加上之前获取的token值后,再次进行访问,发现已经可以获取访问资源控制器,并返回对应的数据 net - 图3