You need to enable JavaScript to run this app. OpenIdDict 3.0 控制器携带访问令牌返回401、误接受ID令牌的问题
优惠活动
大模型
产品
解决方案
定价
更多

OpenIdDict 3.0 控制器携带访问令牌返回401、误接受ID令牌的问题

根因定位与修复方案

核心根因

这是OpenIddict 3.0的配置行为变更和无效注册导致的兼容性问题,和你现有代码的问题点完全匹配:

  • OpenIddict 3.0 默认将访问令牌格式改为加密JWE
    从3.0版本开始,出于安全考虑,OpenIddict默认不再生成未加密的JWS格式访问令牌,而是生成带加密保护的JWE格式访问令牌。这也是你之前2.0版本配置能正常运行的核心原因:2.0默认未开启访问令牌加密。
    你已经在Server配置里注册了AddDevelopmentEncryptionCertificate(),OpenIddict检测到加密凭证后就会默认启用访问令牌加密,生成的访问令牌为JWE格式。
    你当前用的原生AddJwtBearer中间件仅支持解密/验证未加密的JWS令牌,根本无法处理JWE格式的访问令牌,因此携带访问令牌时会直接解析失败返回401。而ID令牌从OpenID Connect规范层面就要求是仅签名的JWS格式,原生JwtBearer可以正常解析,因此反而能通过认证。
  • OpenIddict自带的验证组件完全没有被启用
    你虽然在代码里注册了OpenIddict的Validation模块,但是全局默认认证方案绑定的是JwtBearerDefaults.AuthenticationScheme,OpenIddict的验证逻辑从未被触发。OpenIddict自带的验证中间件才是能同时处理JWS(ID令牌)和JWE(访问令牌)的正确实现,你现在的配置等于把正确的验证逻辑完全绕过了。

具体修复步骤

  • 删除冗余的原生JwtBearer注册
    把这段无效的代码直接删除即可:
    services
        .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Authority = Configuration["Jwt:Authority"];
            options.Audience = Configuration["Jwt:Audience"];
            options.RequireHttpsMetadata = bool.TryParse(Configuration["Jwt:Https"], out bool isHttps) && isHttps;
        });
    
  • 配置OpenIddict验证组件为默认认证方案
    修改OpenIddict Validation模块的配置,指定合法令牌受众,同时设为全局默认认证方案:
    .AddValidation(options =>
    {
        options.UseLocalServer();
        options.UseAspNetCore();
        // 新增:指定访问令牌的合法受众,和你之前配置的Audience对齐
        options.AddAudiences(Configuration["Jwt:Audience"]);
        // 新增:将OpenIddict验证方案设为全局默认
        options.UseAspNetCore().SetDefaultSchemas();
    });
    

    如果你需要保留多认证方案的场景,也可以不用设全局默认,直接给受保护的控制器/Action加[Authorize(AuthenticationSchemes = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme)]即可。

  • (可选)兼容旧配置的临时方案
    如果你一定要沿用原生JwtBearer做验证,也可以在OpenIddict Server配置里强制关闭访问令牌加密,生成和2.0兼容的JWS格式访问令牌:
    // 在AddServer的配置块中追加
    options.DisableAccessTokenEncryption();
    
    该方案会降低访问令牌的安全性(令牌载荷可被任意方解码),不推荐生产环境使用。

额外排查点

修复后如果仍出现401,逐一核对:

  • 你配置的Audience值和OpenIddict生成令牌时传入的aud声明完全一致
  • 本地开发使用HTTP协议时,不要启用强制HTTPS元数据校验的逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 17:36:02