跨Azure AD B2C租户联合时User ID声明映射失效问题
问题描述
参照官方《Set up sign-up and sign-in with an Azure AD B2C account from another Azure AD B2C tenant》文档指引,采用user flow策略类型完成跨Azure AD B2C租户身份提供商配置后,基础注册登录功能可正常运行,但在「Configure Azure AD B2C as an identity provider」章节的自定义身份提供商声明映射环节出现异常。
尝试将自定义用户属性映射到User ID声明时,若将该属性映射到Given Name等其他声明,映射逻辑可正常生效,具体现象如下:
- Fabrikam B2C租户中配置了名为
Clock Number的自定义用户属性,直接运行该租户的注册/登录user flow时,返回令牌中的sub声明值对应用户的ObjectID,可正常识别该自定义属性。
(附现象截图:自定义声明在令牌中正常显示) - 在Contoso B2C租户中,将
extension_ClockNumber映射到Given Name后运行注册/登录user flow,Clock Number取值可正确映射到given_name声明,但此时sub声明的取值不再是用户的ObjectID,不符合预期。
(附现象截图:sub声明取值异常) - 若将
extension_ClockNumber映射到User ID后运行user flow,映射逻辑未生效,预期extension_ClockNumber的取值应出现在sub声明中但实际未实现。
(附现象截图:映射到User ID时未生效)
根因说明
这是Azure AD B2C user flow的固有设计规则,不属于配置错误:
- 联邦身份提供商配置中的
User ID映射项,作用是指定从联邦IdP返回的哪个claim作为联邦用户的唯一标识,Azure AD B2C会用该值填充本地目录中联邦用户对象的alternativeSecurityId属性,作为跨租户关联用户的唯一凭据,不会直接将该值输出到令牌的sub声明中。 - 映射到
Given Name时sub取值异常,是因为未将User ID映射项绑定到联邦IdP返回的用户唯一标识(即Fabrikam租户返回的用户ObjectID/sub/oid声明),导致B2C无法正确生成联邦用户的本地唯一标识,最终sub取值错乱。 - 映射自定义属性到
User ID不生效有两个核心原因:- 跨租户传递自定义扩展属性时,属性名会自动携带源租户扩展应用的ID前缀,完整格式为
extension_{源租户b2c-extensions-app无连字符客户端ID}_ClockNumber,直接使用extension_ClockNumber无法匹配到源属性。 sub属于Azure AD B2C的系统保留声明,user flow层面未开放自定义替换该声明取值的能力,无论怎么配置映射,都无法直接修改sub的生成逻辑。
- 跨租户传递自定义扩展属性时,属性名会自动携带源租户扩展应用的ID前缀,完整格式为
修复步骤
- 修正基础映射,恢复
sub声明正常取值
必须显式将Fabrikam租户返回的用户ObjectID(对应oid/sub声明)映射到Contoso侧IdP配置的User ID项,禁止将其他自定义属性映射到该位置,否则会持续出现sub异常、重复创建联邦用户等问题。 - 正确配置自定义属性映射
- 登录Fabrikam B2C租户,进入「应用注册」-「所有应用」,找到名为
b2c-extensions-app. Do not modify. Used by AADB2C for storing user data.的系统应用,复制其客户端ID并删除所有连字符。例如客户端ID为123e4567-e89b-12d3-a456-426614174000,处理后为123e4567e89b12d3a456426614174000。 - 回到Contoso租户的联邦IdP声明映射页,自定义属性的源声明填写完整格式:
extension_<上一步获取的无连字符客户端ID>_ClockNumber。 - 将该源声明映射到Contoso租户侧新建的同名自定义用户属性(比如新建
Clock Number自定义属性),不要尝试映射到sub等系统保留声明。 - 进入对应user flow的「应用程序声明」配置页,勾选新增的
Clock Number属性,重新运行user flow即可在令牌中拿到正确的属性值。
- 登录Fabrikam B2C租户,进入「应用注册」-「所有应用」,找到名为
补充说明:如果业务强依赖将
Clock Number作为令牌sub声明的取值,user flow无法实现该需求,必须切换使用Azure AD B2C自定义策略(IEF)自行配置声明生成逻辑。
内容的提问来源于stack exchange,提问作者Newm
相关产品推荐
相关产品推荐

