AD B2C对接OIDC联邦外部IdP时无法获取email声明
问题根因
email声明无法获取由三个配置错误共同导致:
- 联邦IdP侧应用权限配置不全。当前联邦B2C租户的应用注册仅授予了
openid、offline_access两个委托权限,未授予email、profile权限,哪怕宿主B2C请求scope里写了这两个参数,IdP也不会签发对应权限覆盖的声明。 - 宿主B2C配置文件内email声明映射规则缺失。你贴的配置里
<OutputClaim ClaimTypeReferenceId="email" />没有指定PartnerClaimType属性,默认只会匹配IdP返回的、名称完全等于email的声明,只要IdP返回的邮箱字段名有差异(比如部分B2C配置返回emails数组、或者用upn字段存邮箱值)就会映射失败。另外你配置的federatedIDPEmailAddress虽然写了PartnerClaimType为email,但因为IdP本身没返回email字段,所以会一直取默认值"Not Set"。 - 联邦IdP侧的登录流程未配置声明返回规则。就算应用权限配全了,如果联邦B2C签发令牌的用户流/自定义策略没有勾选把邮箱地址加入返回声明,最终返回的id_token里也不会带email字段。
解决步骤
按顺序操作即可修复:
- 补全联邦B2C侧的应用注册权限
- 进入联邦B2C租户的应用注册页,找到给宿主B2C对接用的应用
- 打开「API权限」页,点击「添加权限」,选择
Microsoft Graph-委托权限,勾选email、profile、openid、offline_access四个权限,保存后点击「授予管理员同意」完成授权。注意不要选应用程序权限,必须选委托权限,否则普通用户登录时不生效。
- 配置联邦B2C侧登录流程的声明返回
- 找到联邦B2C当前用于联邦登录的用户流或自定义策略
- 打开「应用程序声明」配置页,勾选「电子邮件地址」选项后保存。如果联邦B2C用本地账号登录,且用户邮箱存在身份验证联系方式中,要确认配置返回的是
email声明,不是其他别名字段。
- 修正宿主B2C base.xml里的声明映射
- 找到贴出的TechnicalProfile下的OutputClaims节点,把原来的
<OutputClaim ClaimTypeReferenceId="email" />替换为显式映射配置,避免字段名不匹配问题:
<OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" DefaultValue="" />- 如果改完测试还是拿不到值,可以把返回的id_token解码查看实际返回的字段名,把PartnerClaimType改成对应字段即可。比如部分老版本B2C配置会把邮箱存在
emails数组里,这时候PartnerClaimType要写成emails[0]。
- 找到贴出的TechnicalProfile下的OutputClaims节点,把原来的
- 配置验证
- 清除浏览器之前留存的联邦登录会话缓存,重新走登录流程测试,此时email、givenName、surname字段均可正常填充。
补充:如果联邦B2C本身用社交账号(比如谷歌、其他第三方IdP)作为登录源,要先确认联邦B2C已经从这些上游IdP拿到了邮箱声明,否则就算配置了返回规则,email值也会为空。
内容的提问来源于stack exchange,提问作者widley
相关产品推荐
相关产品推荐

