Azure B2C自定义策略中REST-CreateUser重复调用且objectId不一致问题
Azure B2C自定义策略REST调用重复及objectId不一致问题解决
问题根源
- 两次调用是因为用户旅程中OrchestrationStep的顺序或类型配置错误,导致在用户正式创建前后各触发了一次REST接口调用;而objectId不一致是因为第一次调用时,AD B2C还未完成用户账户的持久化,此时传递的是临时生成的objectId,账户正式创建后,AD会生成永久的用户objectId,和临时ID完全不同。
- 另外,若REST TechnicalProfile未正确配置会话管理,也可能导致步骤重复执行。
修复方案
1. 调整OrchestrationStep的执行顺序
将REST-CreateUser的调用步骤放在用户账户持久化步骤之后,确保仅在AD B2C完成用户创建后才触发接口调用:
- 找到SignUpOrSignIn旅程中负责创建用户的OrchestrationStep(通常是调用
LocalAccountSignUpWithLogonEmail这类TechnicalProfile的步骤),把REST调用步骤放在它之后,且Type设为ClaimsExchange,避免使用可能重复触发的类型。 - 正确配置示例:
<OrchestrationStep Order="5" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="REST-CreateUser" TechnicalProfileReferenceId="REST-CreateUser" /> </ClaimsExchanges> </OrchestrationStep>
- 检查旅程配置,删除所有重复引用
REST-CreateUser的OrchestrationStep。
2. 确保传递持久化后的objectId
在REST-CreateUser的TechnicalProfile中,直接引用AD B2C生成的持久化objectId,不要在用户创建前调用接口:
<TechnicalProfile Id="REST-CreateUser"> <!-- 其他配置 --> <InputClaims> <InputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="userId" /> <!-- 其他需要传递的声明 --> </InputClaims> </TechnicalProfile>
用户创建完成后,AD B2C会自动将永久的objectId填充到声明中,此时传递给Azure Function的ID就会和最终AD用户的ID一致。
3. 配置会话管理防止重复执行
给REST-CreateUser的TechnicalProfile添加会话管理配置,避免同一会话内重复触发调用:
<TechnicalProfile Id="REST-CreateUser"> <!-- 其他配置 --> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile>
SM-Noop是B2C内置的无操作会话管理器,能有效防止REST步骤因会话机制重复执行。
验证步骤
- 重新发布自定义策略后,进行新用户注册测试,查看Azure Function的日志,确认仅被调用一次。
- 注册完成后,对比AD B2C用户的objectId与Azure Function接收的userId,确认两者一致。
内容的提问来源于stack exchange,提问作者Brett Maytom PST
相关产品推荐
相关产品推荐

