You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.5 KiB
5.5 KiB
JWT 服务注册指南
服务注册概览
JWT 相关的服务注册主要分布在两个位置:
Program.cs
- Web API 层的服务注册DependencyInjection.cs
- 基础设施层的服务注册
1. 基础设施层注册 (DependencyInjection.cs)
1.1 JWT 配置注册
// 配置 JWT 选项
services.Configure<JwtOptions>(configuration.GetSection(JwtOptions.SectionName));
services.AddSingleton<IConfigureOptions<JwtBearerOptions>, JwtBearerOptionsSetup>();
services.AddScoped<IJwtProvider, JwtProvider>();
说明:
Configure<JwtOptions>
: 从配置文件加载 JWT 配置JwtBearerOptionsSetup
: 配置 JWT Bearer 认证选项JwtProvider
: 实现 JWT 令牌的生成和验证
1.2 密钥管理服务注册
// 注册密钥轮换服务
services.AddSingleton<IKeyRotationService, KeyRotationService>();
services.AddHostedService<KeyRotationBackgroundService>();
说明:
KeyRotationService
: 管理 JWT 密钥的生命周期KeyRotationBackgroundService
: 后台服务,定期执行密钥轮换
1.3 认证服务注册
// 配置JWT认证
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer();
services.AddAuthorization();
说明:
- 设置默认认证方案为 JWT Bearer
- 启用授权服务
2. Web API 层注册 (Program.cs)
2.1 JWT 配置注册
// 配置JWT认证
builder.Services.Configure<JwtOptions>(builder.Configuration.GetSection("JwtOptions"));
builder.Services.AddSingleton<IConfigureOptions<JwtBearerOptions>, JwtBearerOptionsSetup>();
2.2 认证服务注册
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer();
2.3 Swagger 配置
builder.Services.AddSwaggerGen(options =>
{
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
Scheme = "Bearer"
});
options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
Array.Empty<string>()
}
});
});
3. 服务注册优化建议
3.1 避免重复注册
目前存在重复注册的问题:
- JWT 配置在两个地方都进行了注册
- 认证服务在两个地方都进行了配置
建议优化方案:
// 在 DependencyInjection.cs 中统一注册
public static IServiceCollection AddJwtServices(
this IServiceCollection services,
IConfiguration configuration)
{
// 配置 JWT 选项
services.Configure<JwtOptions>(configuration.GetSection(JwtOptions.SectionName));
// 注册 JWT 服务
services.AddSingleton<IConfigureOptions<JwtBearerOptions>, JwtBearerOptionsSetup>();
services.AddScoped<IJwtProvider, JwtProvider>();
services.AddSingleton<IKeyRotationService, KeyRotationService>();
services.AddHostedService<KeyRotationBackgroundService>();
// 配置认证
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer();
services.AddAuthorization();
return services;
}
3.2 配置文件结构
建议的 JWT 配置结构:
{
"JwtOptions": {
"SecretKey": "your-secret-key",
"Issuer": "your-issuer",
"Audience": "your-audience",
"ExpiryMinutes": 15,
"RefreshTokenExpiryDays": 7,
"ClockSkewMinutes": 5,
"KeyRotationDays": 30,
"MinKeyLength": 64
}
}
4. 中间件配置
4.1 认证中间件
// 启用认证中间件
app.UseAuthentication();
// 启用授权中间件
app.UseAuthorization();
4.2 HTTPS 重定向
// 启用 HTTPS 重定向
app.UseHttpsRedirection();
5. 使用建议
-
配置管理
- 使用强类型配置
- 集中管理配置项
- 避免硬编码敏感信息
-
服务注册
- 使用扩展方法组织服务注册
- 避免重复注册
- 遵循依赖注入最佳实践
-
安全配置
- 启用 HTTPS
- 配置适当的 CORS 策略
- 实现完整的认证和授权
-
开发体验
- 配置 Swagger 文档
- 提供详细的错误信息
- 实现适当的日志记录
6. 常见问题
-
配置加载失败
- 检查配置文件路径
- 验证配置节点名称
- 确保配置值格式正确
-
认证失败
- 检查令牌格式
- 验证密钥配置
- 确认过期时间设置
-
密钥轮换问题
- 检查轮换间隔设置
- 验证密钥生成逻辑
- 确保缓存正确更新
-
性能问题
- 优化令牌验证
- 使用适当的缓存策略
- 控制令牌大小