配置认证与授权
1 2 3 4 5
| // 添加认证服务 builder.Services.AddAuthentication();
// 添加授权服务 builder.Services.AddAuthorization();
|
AddAuthentication():注册认证系统,用JWT认证。
AddAuthorization():注册授权系统,用于在 [Authorize] 等特性中判断用户是否有权限访问。
读取并绑定 JWT 配置,注册 JWT 认证方案
1 2
| JWTOptions jwtOpt = configuration.GetSection("JWT").Get<JWTOptions>();
|
从配置源读取JWT节点,并绑定到 JWTOptions 对象里。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class JWTOptions { public string Issuer { get; set; }
public string Audience { get; set; }
public string Key { get; set; }
public int ExpireSeconds { get; set; } }
|
1 2
| services.Configure<JWTOptions>(configuration.GetSection("JWT"));
|
services
依赖注入容器(IServiceCollection)实例。这里我们往容器中添加配置绑定。
Configure<TOptions>
来自 Microsoft.Extensions.Options.ConfigurationExtensions,用于把配置文件里的某个部分绑定到 TOptions 类型,并注册成 Options 模式 对象。
注册后,你可以在任何地方通过 IOptions<JWTOptions>来获取这个对象。
1 2
| builder.Services.AddJWTAuthentication(jwtOpt);
|
注册JWT服务需要配置JWT令牌验证参数,这里自定义了AddJWTAuthentication扩张方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public static class AuthenticationExtensions { public static AuthenticationBuilder AddJWTAuthentication(this IServiceCollection services, JWTOptions jwtOpt) { return services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(x => { x.TokenValidationParameters = new() { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = jwtOpt.Issuer, ValidAudience = jwtOpt.Audience, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtOpt.Key)), }; }); } }
|
AuthenticationBuilder —— 方便你后面继续链式配置认证
AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
告诉 ASP.NET Core 默认使用 Bearer Token(即 Authorization: Bearer <token>)来认证。
AddJwtBearer(…)
注册 JWT Bearer 认证处理器,并配置如何验证 token。
TokenValidationParameters
ValidateIssuer / ValidIssuer:检查 token 里 iss 声明是否和配置一致。
ValidateAudience / ValidAudience:检查 token 里 aud 声明是否和配置一致。
ValidateLifetime:检查 token 是否过期(取决于 exp 和 nbf 字段)。
ValidateIssuerSigningKey:检查 token 签名是否有效(防篡改)。
IssuerSigningKey:签名用的密钥(这里用 HMACSHA256 对称加密)。
配置 Swagger 支持 JWT 调试
1 2 3 4
| builder.Services.Configure<SwaggerGenOptions>(c => { c.AddAuthenticationHeader(); });
|
给 Swagger UI 添加一个 “Authorize” 按钮,可以输入 Bearer Token,在接口调试时自动带上 Authorization 头。
AddAuthenticationHeader是自定义扩张方法,向 Swagger 配置中添加认证头(Authorization Header), 使得在 Swagger UI 中可以输入 JWT Token 进行接口测试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| public static class SwaggerGenOptionsExtensions { public static void AddAuthenticationHeader(this SwaggerGenOptions c) { c.AddSecurityDefinition("Authorization", new OpenApiSecurityScheme { Description = "Authorization header .\r\n Example:'Bearer 12345abcdef'", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, Scheme = "Authorization" });
c.AddSecurityRequirement(new OpenApiSecurityRequirement() { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id="Authorization" }, Scheme = "oauth2", Name="Authorization", In=ParameterLocation.Header, }, new List<string>() } }); } }
|
在 Swagger UI 顶部加一个 “Authorize” 按钮。
让所有 API 请求都自动带上 Authorization HTTP 头。