Azure B2C本地账户关联多社交账号时覆盖问题求助
解决Azure B2C本地账户关联多个社交提供商时身份被覆盖的问题
你遇到的核心问题是当前使用的AAD-UserWriteUsingAlternativeSecurityId-ThrowIfNotExists技术配置采用了Write操作——这个操作会直接覆盖用户的alternativeSecurityId属性(对应Graph API里的userIdentities数组),而不是追加新的身份信息。要实现多社交身份关联,我们需要改用Patch操作,并先读取用户现有身份再合并新身份。
具体解决方案步骤
1. 定义身份合并的Claims转换
首先添加一个Claims转换逻辑,用于将新的社交身份追加到用户现有的身份集合中:
<ClaimsTransformations> <ClaimsTransformation Id="AddNewAlternativeSecurityIdToExisting" TransformationMethod="AddItemToStringCollection"> <InputClaims> <InputClaim ClaimTypeReferenceId="existingAlternativeSecurityIds" TransformationClaimType="collection" /> <InputClaim ClaimTypeReferenceId="alternativeSecurityId" TransformationClaimType="item" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="mergedAlternativeSecurityIds" TransformationClaimType="collection" /> </OutputClaims> </ClaimsTransformation> </ClaimsTransformations>
同时需要定义对应的Claim类型:
<ClaimType Id="existingAlternativeSecurityIds"> <DisplayName>Existing Linked Social Identities</DisplayName> <DataType>stringCollection</DataType> </ClaimType> <ClaimType Id="mergedAlternativeSecurityIds"> <DisplayName>Merged Social Identities</DisplayName> <DataType>stringCollection</DataType> </ClaimType>
2. 更新技术配置文件
替换原有的Write操作技术配置,改为读取现有身份、合并身份、Patch更新三个步骤:
读取用户现有身份的技术配置
<TechnicalProfile Id="AAD-UserReadAlternativeSecurityIds"> <Metadata> <Item Key="Operation">Read</Item> <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item> </Metadata> <IncludeInSso>false</IncludeInSso> <InputClaims> <InputClaim ClaimTypeReferenceId="objectId" Required="true" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="existingAlternativeSecurityIds" PartnerClaimType="alternativeSecurityIds" /> </OutputClaims> <IncludeTechnicalProfile ReferenceId="AAD-Common" /> </TechnicalProfile>
合并新旧身份的技术配置
<TechnicalProfile Id="MergeAlternativeSecurityIds"> <DisplayName>Merge Existing and New Social Identities</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <InputClaims> <InputClaim ClaimTypeReferenceId="alternativeSecurityId" /> <InputClaim ClaimTypeReferenceId="existingAlternativeSecurityIds" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="mergedAlternativeSecurityIds" /> </OutputClaims> <ClaimsTransformations> <ClaimsTransformationReference Id="AddNewAlternativeSecurityIdToExisting" /> </ClaimsTransformations> </TechnicalProfile>
使用Patch操作更新用户身份的技术配置
<TechnicalProfile Id="AAD-UserPatchAlternativeSecurityIds"> <Metadata> <Item Key="Operation">Patch</Item> <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item> <Item Key="SuppressDuplicateAlternativeSecurityIdError">true</Item> <!-- 避免重复关联同一社交账号时出错 --> </Metadata> <IncludeInSso>false</IncludeInSso> <InputClaims> <InputClaim ClaimTypeReferenceId="objectId" Required="true" /> </InputClaims> <PersistedClaims> <PersistedClaim ClaimTypeReferenceId="objectId" /> <PersistedClaim ClaimTypeReferenceId="mergedAlternativeSecurityIds" PartnerClaimType="alternativeSecurityIds" /> </PersistedClaims> <IncludeTechnicalProfile ReferenceId="AAD-Common" /> </TechnicalProfile>
3. 调整用户旅程步骤
将原有的单一Write步骤替换为三个连贯的操作步骤:
<!-- Step 1: 读取用户已关联的所有社交身份 --> <OrchestrationStep Order="4" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="AAD-UserReadAlternativeSecurityIds" TechnicalProfileReferenceId="AAD-UserReadAlternativeSecurityIds" /> </ClaimsExchanges> </OrchestrationStep> <!-- Step 2: 合并现有身份与新的社交身份 --> <OrchestrationStep Order="5" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="MergeAlternativeSecurityIds" TechnicalProfileReferenceId="MergeAlternativeSecurityIds" /> </ClaimsExchanges> </OrchestrationStep> <!-- Step 3: 使用Patch操作追加新身份(而非覆盖) --> <OrchestrationStep Order="6" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="AAD-UserPatchAlternativeSecurityIds" TechnicalProfileReferenceId="AAD-UserPatchAlternativeSecurityIds" /> </ClaimsExchanges> </OrchestrationStep>
关键说明
- Patch操作:替代Write操作实现部分属性更新,确保不会覆盖用户已有的社交身份数组。
- 身份合并逻辑:必须先读取用户现有身份,再将新身份追加到集合中,避免数据丢失。
- 重复身份抑制:
SuppressDuplicateAlternativeSecurityIdError元数据可以防止用户重复关联同一社交账号时流程中断。
完成上述修改后,用户关联Facebook和Google后,userIdentities会同时保留两个条目,不会再出现覆盖问题。
内容的提问来源于stack exchange,提问作者Miha J
相关产品推荐
相关产品推荐

