如何为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
相关产品推荐
相关产品推荐

