You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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步骤因会话机制重复执行。

验证步骤

  1. 重新发布自定义策略后,进行新用户注册测试,查看Azure Function的日志,确认仅被调用一次。
  2. 注册完成后,对比AD B2C用户的objectId与Azure Function接收的userId,确认两者一致。

内容的提问来源于stack exchange,提问作者Brett Maytom PST

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 09:27:21