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

如何为ADFS的openid-configuration添加更多claims_supported声明?

解决ADFS JWT令牌无法返回given_name、email等声明的问题

问题场景

我已在OAuth2授权请求中添加openid、email、profile scope,请求示例:

https://example.com/adfs/oauth2/authorize/?client_id=8acf9328-1467-4d9f-ae69-8c2ed6e5d6ca&redirect_uri=https://localhost:4400/signin-oidc&response_type=code&scope=openid profile email...

ASP.NET Core的OpenID Connect配置如下:

.AddOpenIdConnect(options =>
{
    options.SignInScheme = "Cookies";
    options.Authority = config.AuthenticationOptions.Authority;
    options.RequireHttpsMetadata = true;
    options.ResponseType = OpenIdConnectResponseType.Code;
    options.UsePkce = false;
    options.Scope.Clear();
    options.Scope.Add("openid");
    options.Scope.Add("profile");
    options.Scope.Add("email");
    options.SaveTokens = true;
    options.MetadataAddress = config.AuthenticationOptions.Configuration;
    options.ClientId = config.AuthenticationOptions.ClientId;
});

但实际返回的JWT令牌仅包含ADFS元数据.well-known/openid-configuration中claims_supported列表里的声明:

"claims_supported": [
"aud",
"iss",
"iat",
"exp",
"auth_time",
"nonce",
"at_hash",
"c_hash",
"sub",
"upn",
"unique_name",
"pwd_url",
"pwd_exp",
"mfa_auth_time",
"sid",
"nbf"
],

同时https://example.com/adfs/userinfo端点仅返回sub声明。

确认ADFS元数据中scopes_supported已包含email和profile:

"scopes_supported": [
"logon_cert",
"user_impersonation",
"vpn_cert",
"winhello_cert",
"allatclaims",
"aza",
"openid",
"email",
"profile"
],

且已在ADFS中完成所需声明的映射,但JWT仍仅包含有限声明,需要解决如何让given_name、email等声明被包含到JWT中,并更新claims_supported列表。


解决步骤

1. 检查应用程序级别的声明规则配置

全局声明映射不代表会自动应用到特定客户端,需确保目标应用程序配置了对应规则:

  • 打开ADFS管理控制台,找到你的客户端应用程序
  • 右键选择属性,切换到颁发转换规则标签页
  • 添加新规则:
    • 规则模板选发送LDAP属性作为声明
    • 自定义规则名称(比如“映射Email和Profile声明”)
    • 属性存储选Active Directory
    • 添加LDAP属性与标准OIDC声明的映射:
      • 给定名称 → given_name
      • 电子邮件地址 → email
      • 姓氏 → family_name
    • 保存规则

2. 启用ADFS应用程序的强制声明传递

ADFS默认可能不会将额外声明包含进JWT,通过PowerShell配置:

  • 先查询目标应用的当前设置:
Get-AdfsApplicationPermission -ClientRoleIdentifier "你的客户端ID" | Select-Object AlwaysSendClaimsInSamlAssertion
  • 如果返回$false,执行命令修改:
Set-AdfsApplicationPermission -ClientRoleIdentifier "你的客户端ID" -AlwaysSendClaimsInSamlAssertion $true

3. 更新ADFS元数据并重启服务

修改配置后需重启服务让元数据生效:

Restart-Service adfssrv

重启后访问https://example.com/adfs/.well-known/openid-configuration,检查claims_supported是否已新增given_name、email等声明。

4. 客户端配置优化(可选)

在ASP.NET Core配置中添加声明映射,确保客户端正确解析返回的声明:

.AddOpenIdConnect(options =>
{
    // 原有配置...
    options.ClaimActions.MapJsonKey("given_name", "given_name");
    options.ClaimActions.MapJsonKey("email", "email");
    // 尝试从userinfo端点获取声明(需ADFS端先配置好)
    options.GetClaimsFromUserInfoEndpoint = true;
});

5. 排查声明筛选规则

检查ADFS是否存在全局或应用级别的筛选规则,过滤了目标声明:

  • 在ADFS管理控制台中,查看声明提供程序信任和依赖方信任的声明筛选规则
  • 确保没有拒绝或移除given_name、email等声明的规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:47:25