You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8自定义JWT的JWKS验证未执行,授权逻辑未触发求助

.NET 8 JWT Bearer认证问题:自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 04:35:58