如何通过自定义策略将多个UPN、邮箱域名关联至单个IdP?
解决多域名关联同一OpenID IdP的问题
问题核心
需让company1.com、company2.com、company3.com三个域名的用户,通过同一个企业Azure租户的OpenID IdP登录,但新增多个OrchestrationStep后触发了用户重复创建错误(AADB2C99001)。
错误原因
新增多个独立的OrchestrationStep会导致:当用户域名匹配其中一个时,触发对应的IdP交换,但后续流程中可能重复处理用户标识,或者同一用户被多次关联到同一个IdP,导致B2C尝试重复创建已存在的用户记录。
正确实现方式
无需拆分多个步骤,只需在单个OrchestrationStep中通过OrGroup预条件组匹配所有目标域名,确保同一IdP仅触发一次交换,避免重复问题。
修改后的OrchestrationStep代码
<OrchestrationStep Order="4" Type="ClaimsExchange"> <Preconditions> <Precondition Type="ClaimsExist" ExecuteActionsIf="true"> <Value>objectId</Value> <Action>SkipThisOrchestrationStep</Action> </Precondition> <!-- 用OrGroup包裹多个域名匹配条件 --> <Precondition Type="OrGroup" ExecuteActionsIf="false"> <Preconditions> <Precondition Type="ClaimEquals" ExecuteActionsIf="true"> <Value>domain</Value> <Value>company1.com</Value> </Precondition> <Precondition Type="ClaimEquals" ExecuteActionsIf="true"> <Value>domain</Value> <Value>company2.com</Value> </Precondition> <Precondition Type="ClaimEquals" ExecuteActionsIf="true"> <Value>domain</Value> <Value>company3.com</Value> </Precondition> </Preconditions> <Action>SkipThisOrchestrationStep</Action> </Precondition> </Preconditions> <ClaimsExchanges> <ClaimsExchange Id="Company1Exchange" TechnicalProfileReferenceId="Company1-OpenIdConnect" /> </ClaimsExchanges> </OrchestrationStep>
代码说明
- OrGroup预条件组:只要用户的
domain声明匹配任意一个目标域名,就不会跳过当前步骤,触发对应的OpenID IdP交换。 - ClaimsExist预条件:若用户已是B2C本地用户(存在
objectId),则跳过IdP登录步骤,避免不必要的IdP调用。 - 移除多余步骤:所有域名共用同一个步骤和TechnicalProfile,确保IdP仅触发一次,避免重复创建用户标识。
补充检查
- 确认
Company1-OpenIdConnect技术配置文件中,Azure AD租户允许三个域名的用户登录(因用户同属一个租户,默认已支持)。 - 确保
domain声明是从用户输入的UPN/邮箱后缀正确提取的。
内容的提问来源于stack exchange,提问作者John Celata
相关产品推荐
相关产品推荐

