升级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字段的处理逻辑做了调整:
自动Audience管理:OpenIddict 4.x默认会根据请求的scope或应用配置的资源自动生成
aud字段,不再允许手动添加audclaim到身份标识中,框架会覆盖或忽略手动添加的aud claim,以确保符合OIDC规范。解决方法:
- 方法一:通过应用配置指定Audience
在创建应用时,配置AllowedScopes或Resources,让OpenIddict自动生成正确的aud字段。例如:await applicationManager.CreateAsync(new OpenIddictApplicationDescriptor { ClientId = "postman", // 其他配置... Resources = { "api" } }); - 方法二:关闭自动Audience验证(不推荐,除非有特殊需求)
如果必须手动控制aud字段,可以在OpenIddict服务器配置中关闭自动audience管理:services.AddOpenIddict() .AddServer(options => { options.DisableAutomaticAudienceValidation(); // 其他服务器配置... }); - 检查代码中是否存在其他覆盖
audclaim的逻辑,或配置了与audience相关的冲突选项。
- 方法一:通过应用配置指定Audience
内容的提问来源于stack exchange,提问作者Rashed
相关产品推荐
相关产品推荐

