OpenIddict 4.3.0迁移后无法获取交换响应中的自定义声明
解决OpenIddict 4.3.0自定义声明无法返回前端的问题
检查声明添加的目标配置
OpenIddict 4.x对声明目标的要求比3.x更严格,必须显式指定声明要写入的令牌类型。在Exchange流程中添加自定义声明时,需明确指定目标:
var identity = new ClaimsIdentity(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); // 同时指定写入IdentityToken和AccessToken(根据前端需求选择) identity.AddClaim(ClaimTypes.NameIdentifier, user.Id.ToString(), OpenIddictConstants.Destinations.AccessToken, OpenIddictConstants.Destinations.IdentityToken); identity.AddClaim("tenantid", user.TenantId.ToString(), OpenIddictConstants.Destinations.AccessToken, OpenIddictConstants.Destinations.IdentityToken);
验证UserInfo端点的配置
如果前端通过UserInfo端点获取声明,需确保服务器启用该端点,并给声明添加UserInfo目标:
服务器配置
services.AddOpenIddict() .AddServer(options => { options.SetUserInfoEndpointUris("/connect/userinfo"); options.AllowAuthorizationCodeFlow(); // 确保启用前端使用的授权类型 });
声明添加
identity.AddClaim("tenantid", user.TenantId.ToString(), OpenIddictConstants.Destinations.UserInfo);
检查客户端Scope配置
确认Angular OIDC-Client请求的Scope包含所需范围(如profile或自定义Scope):
// Angular OIDC-Client配置示例 const config: UserManagerSettings = { client_id: "your-client-id", redirect_uri: "https://your-app/callback", scope: "openid profile", // 需包含声明所属的Scope // 其他配置项 };
若声明属于自定义Scope,需先在服务器注册该Scope并关联声明:
services.AddOpenIddict() .AddServer(options => { options.RegisterScopes("openid", "profile", "tenant"); }); // 添加声明时关联Scope identity.AddClaim("tenantid", user.TenantId.ToString(), OpenIddictConstants.Destinations.AccessToken) .SetClaimScope("tenant");
排查声明过滤逻辑
检查是否有自定义的ClaimsPrincipalHandler误删了声明:
// 若使用了自定义处理器,确保未移除目标声明 services.AddOpenIddict() .AddServer(options => { options.AddClaimsPrincipalHandler<CustomClaimsPrincipalHandler>(); });
验证令牌内容
用JWT解析工具(如本地调试或离线解析器)查看返回的Id Token/AccessToken,确认声明是否已写入令牌:
- 若令牌中无声明:回到服务器端检查声明添加逻辑
- 若令牌中有但前端无法获取:检查Angular OIDC-Client的令牌解析配置,确保未过滤自定义声明
内容的提问来源于stack exchange,提问作者jit-dev
相关产品推荐
相关产品推荐

