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

ASP.NET 6 JWT Bearer认证返回401:签名密钥未找到问题排查

问题分析与解决方案

核心问题

  1. 算法不匹配:你的Token采用RS256非对称加密算法,但代码里用了SymmetricSecurityKey(对称密钥)做验证,两者完全不兼容,直接导致签名验证失败。
  2. Authority配置错误:Authority应指向Keycloak的Realm根地址(格式为http://localhost:xxx/realms/xxx),而非Token里的azp(客户端ID)值。正确配置后,JWT Bearer中间件会自动从Keycloak的/.well-known/openid-configuration端点获取公钥,无需手动指定IssuerSigningKey。
  3. 冗余配置冲突:手动设置的IssuerSigningKey与Authority自动获取密钥的逻辑冲突,且密钥类型错误,进一步加剧了验证失败问题。

修正后的配置代码

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(o =>
{
    o.RequireHttpsMetadata = false;
    // 替换为你的Keycloak Realm根地址
    o.Authority = "http://localhost:xxx/realms/xxx";
    // 替换为Token中azp字段对应的客户端ID
    o.Audience = "account xxx";
    o.TokenValidationParameters = new TokenValidationParameters
    {
        ValidIssuer = "http://localhostxxx", // 与Token的iss字段保持完全一致
        ValidateIssuer = true,
        ValidateAudience = true, // 开启受众验证,配合Audience配置
        ValidateLifetime = true, // 建议开启过期时间验证,提升安全性
        // 移除冗余的手动密钥配置,交由Authority自动获取公钥
    };
});

额外验证步骤

  • 确认Keycloak Realm地址正确:访问http://localhost:xxx/realms/xxx/.well-known/openid-configuration,能正常返回配置信息,其中jwks_uri应指向你提到的certs地址。
  • 检查Token的iss字段与配置的ValidIssuer完全一致,注意端口、路径不能有拼写错误。
  • 若问题仍存在,可开启中间件日志排查细节:
    o.Events = new JwtBearerEvents
    {
        OnAuthenticationFailed = context =>
        {
            Console.WriteLine($"验证失败详情:{context.Exception.Message}");
            return Task.CompletedTask;
        }
    };
    

内容的提问来源于stack exchange,提问作者maxfromgermany

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:31:03