Azure AD B2C自定义策略读取Azure AD用户employeeId值为空问题咨询
问题场景
- Azure AD租户侧已为对应用户配置employeeId属性值:

- 用户登录后,Azure AD B2C租户内对应用户未同步到employeeId属性值:

- 已完成扩展声明类型定义,但策略返回的employeeid始终为空,现有声明配置如下:
<ClaimType Id="extension_employeeid"> <DisplayName>EmployeeId</DisplayName> <DataType>string</DataType> <DefaultPartnerClaimTypes> <Protocol Name="OAuth2" PartnerClaimType="employeeid" /> <Protocol Name="OpenIdConnect" PartnerClaimType="employeeid" /> <Protocol Name="SAML2" PartnerClaimType="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/employeeid" /> </DefaultPartnerClaimTypes> <UserHelpText>Your EmployeeId. </UserHelpText> <!--<UserInputType>Readonly</UserInputType>--> <UserInputType>TextBox</UserInputType> </ClaimType>
根因说明
仅定义扩展属性声明类型无法完成属性同步,缺失三个核心配置:Azure AD身份提供程序侧的声明输出映射、首次登录时的B2C目录写入规则、后续登录时的B2C目录读取规则。
修复步骤
1. 配置Azure AD身份提供程序的输出声明映射
找到自定义策略中配置Azure AD联邦登录的TechnicalProfile(通常命名为AAD-Common或对应Azure AD IdP的专属技术配置文件),在<OutputClaims>节点下新增employeeId的映射规则。注意Azure AD内置employeeId属性返回的声明URI为微软官方固定值,不要使用自定义的声明命名空间:
<OutputClaims> <!-- 保留原有已配置的输出声明,如issuer、objectId、displayName等 --> <OutputClaim ClaimTypeReferenceId="extension_employeeid" PartnerClaimType="http://schemas.microsoft.com/identity/claims/employeeid" /> </OutputClaims>
注意:如果你的Azure AD联邦配置用的是SAML协议,需要先抓包确认SAML断言中employeeId的实际命名空间,替换上述PartnerClaimType值即可。
2. 配置首次用户创建时的属性持久化规则
用户首次通过Azure AD登录B2C时,会调用AAD-UserWriteUsingAlternativeSecurityId技术配置文件在B2C租户创建用户档案,需要在该配置的<PersistedClaims>节点新增扩展属性写入规则,否则拿到的employeeId不会存入B2C目录:
<PersistedClaims> <!-- 保留原有已配置的持久化声明,如alternativeSecurityId、userPrincipalName等 --> <PersistedClaim ClaimTypeReferenceId="extension_employeeid" /> </PersistedClaims>
3. 配置存量用户登录时的属性读取规则
用户档案创建完成后,后续登录会调用AAD-UserReadUsingAlternativeSecurityId技术配置文件读取B2C目录内的用户数据,需要在该配置的<OutputClaims>节点新增扩展属性读取规则:
<OutputClaims> <!-- 保留原有已配置的输出声明 --> <OutputClaim ClaimTypeReferenceId="extension_employeeid" /> </OutputClaims>
4. (可选)配置依赖方输出声明
如果需要在应用收到的ID Token/Access Token中直接返回employeeId值,需要在对应用户旅程的RelyingParty(RP)策略文件的<OutputClaims>节点新增声明输出规则:
<OutputClaims> <!-- 保留原有已配置的输出声明 --> <OutputClaim ClaimTypeReferenceId="extension_employeeid" /> </OutputClaims>
常见踩坑说明
- 你当前配置的
<DefaultPartnerClaimTypes>仅作用于B2C向应用返回Token时的声明名映射,不会自动匹配上游Azure AD IdP返回的声明,必须在IdP的OutputClaim中显式指定PartnerClaimType - 若用户已经完成过首次登录、在B2C租户生成了无employeeId的用户档案,首次创建的写入逻辑不会重复触发,可删除对应用户的B2C档案重新走首次登录流程,或新增判断逻辑:当读取到的extension_employeeid为空时,调用
AAD-UserWriteProfileUsingObjectId技术配置文件补写属性值 - 确认Azure AD侧配置的是内置的「员工ID」属性(路径:Azure AD > 用户 > 选择对应用户 > 编辑属性 > 雇佣信息 > 员工ID),而非自定义扩展属性,自定义扩展属性的声明URI格式和内置属性不一致
内容的提问来源于stack exchange,提问作者Daniel Vega Ruiz

