.NET 8自定义JWT的JWKS验证未执行,授权逻辑未触发求助
问题背景
使用.NET 8开发应用,因自定义JWT无法通过身份提供商的.well-known端点获取JWKS URI,自行实现JWKS解析后,基于JWKS的Token验证始终未执行。已使用Microsoft.AspNetCore.Authentication.JwtBearer 8.0.7包,添加了认证逻辑并启用中间件,但访问带[Authorize]特性的控制器方法时,授权逻辑完全没触发。
已配置代码
Program.cs中的认证逻辑
var jwksText = File.ReadAllText(certificatePath); var keyset = new JsonWebKeySet(jwksText); var selectedKey = keyset[0]; builder.Services .AddAuthentication(defaultScheme: AuthenticationSchemeConstants.JwtBearerScheme) .AddJwtBearer(AuthenticationSchemeConstants.JwtBearerScheme, configureOptions => { configureOptions.TokenValidationParameters.ValidateIssuer = true; configureOptions.TokenValidationParameters.ValidIssuers = new[] {"https://my-nice-issuer"}; configureOptions.TokenValidationParameters.ValidateAudience = true; configureOptions.TokenValidationParameters.RequireSignedTokens = true; configureOptions.TokenValidationParameters.IssuerSigningKey = selectedKey; });
中间件配置
var app = builder.Build(); // 其他中间件 app.UseAuthentication(); app.UseAuthorization(); // 端点配置等
控制器方法授权特性
[Authorize(AuthenticationSchemes = AuthenticationSchemeConstants.JwtBearerScheme)] public async Task<IActionResult> GetData() { // 方法逻辑 }
排查与解决步骤
补全TokenValidationParameters配置
当前配置中ValidateAudience设为true但未指定ValidAudiences,会导致验证失败进而跳过认证逻辑。补充配置或临时关闭Audience验证测试:// 补充受众配置 configureOptions.TokenValidationParameters.ValidAudiences = new[] { "你的应用受众标识" }; // 或临时关闭Audience验证 // configureOptions.TokenValidationParameters.ValidateAudience = false;验证JWKS密钥加载正确性
检查certificatePath对应的文件是否存在、格式是否合法;添加日志确认密钥是否正确读取,同时确保Token中的kid字段与selectedKey.Kid一致:builder.Logging.AddConsole(); var logger = builder.Services.BuildServiceProvider().GetRequiredService<ILogger<Program>>(); logger.LogInformation("加载的JWKS密钥ID: {Kid}", selectedKey.Kid);确认中间件顺序
认证与授权中间件必须放在UseRouting()之后、UseEndpoints()之前,正确顺序示例:var app = builder.Build(); app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); app.Run();启用JWT Bearer调试日志
配置日志级别查看认证过程中的详细错误,定位问题根源:builder.Services.AddLogging(logging => { logging.AddConsole(); logging.SetMinimumLevel(LogLevel.Debug); logging.AddFilter("Microsoft.AspNetCore.Authentication.JwtBearer", LogLevel.Debug); });验证Scheme常量正确性
确保AuthenticationSchemeConstants.JwtBearerScheme的值与AddJwtBearer指定的Scheme一致,默认JWT Bearer Scheme为JwtBearerDefaults.AuthenticationScheme(即"Bearer"),若常量值错误,[Authorize]特性无法匹配到对应的认证逻辑。
内容的提问来源于stack exchange,提问作者Wilko van der Veen

