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

升级OpenIddict 4.2.0后Access Token缺失audience问题排查

.NET 7 + OpenIddict 4.2.0升级后access_token缺失aud字段问题

问题背景

我们的应用原本基于.NET 5.0搭配OpenIddict 3.0.3运行,升级至.NET 7.0并同步将OpenIddict升级到4.2.0后,出现异常:生成的access_token中缺失audience(aud)字段。

旧版本正常Token示例(OpenIddict 3.0.3)

{
  "sub": "admin",
  "oi_prst": "postman",
  "oi_au_id": "172421a9-ac85-4040-8045-2a7505fa447d",
  "aud": "api",
  "client_id": "postman",
  "oi_tkn_id": "02df2c16-9881-46d1-9f69-36fa69192d86",
  "scope": "api openid",
  "exp": 1682342328,
  "iss": "https://localhost:44330/",
  "iat": 1682338728
}

新版本异常情况

OpenIddict 4.2.0生成的token中无aud字段,调试时发现SignIn返回的resp对象中存在aud字段,但最终生成的token里缺失。

相关代码片段

var request = HttpContext.GetOpenIddictServerRequest() ??
              throw new InvalidOperationException("The OpenID Connect request cannot be retrieved.");

var app = await applicationManager.FindByClientIdAsync(request.ClientId) ??
          throw new InvalidOperationException("The application cannot be found.");

var properties = await applicationManager.GetPropertiesAsync(app);
string audience = properties[OpenIddictConstants.Claims.Audience].GetString();

ClaimsPrincipal claimsPrincipal = (await HttpContext.AuthenticateAsync(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme)).Principal;

var identity = ((ClaimsIdentity)claimsPrincipal.Identity);
identity.AddClaim(OpenIddictConstants.Claims.Audience,
                  audience,
                  OpenIddictConstants.Destinations.AccessToken);
var resp = SignIn(claimsPrincipal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);

疑问

此现象是否合理?是否需要针对4.2.0版本修改代码或配置?已确认问题由OpenIddict版本升级导致,谷歌未找到类似问题。


解决方案

这是OpenIddict 4.x版本的预期行为,框架对aud字段的处理逻辑做了调整:

  1. 自动Audience管理:OpenIddict 4.x默认会根据请求的scope或应用配置的资源自动生成aud字段,不再允许手动添加aud claim到身份标识中,框架会覆盖或忽略手动添加的aud claim,以确保符合OIDC规范。

  2. 解决方法:

    • 方法一:通过应用配置指定Audience
      在创建应用时,配置AllowedScopes或Resources,让OpenIddict自动生成正确的aud字段。例如:
      await applicationManager.CreateAsync(new OpenIddictApplicationDescriptor
      {
          ClientId = "postman",
          // 其他配置...
          Resources = { "api" }
      });
      
    • 方法二:关闭自动Audience验证(不推荐,除非有特殊需求)
      如果必须手动控制aud字段,可以在OpenIddict服务器配置中关闭自动audience管理:
      services.AddOpenIddict()
          .AddServer(options =>
          {
              options.DisableAutomaticAudienceValidation();
              // 其他服务器配置...
          });
      
    • 检查代码中是否存在其他覆盖aud claim的逻辑,或配置了与audience相关的冲突选项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:45:13