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

Azure B2C自定义策略拆分注册流程故障排查求助

拆分Azure B2C本地账户注册流程的解决方案

问题根源

你遇到的500错误,是因为移除LocalAccountSignUpWithLogonEmail中的用户写入验证配置后,第一步的自我断言技术配置缺少必要的逻辑支撑,或是第二步的技术配置未正确承接第一步收集的邮箱、密码信息,导致策略执行时无法获取必需的用户属性。

具体修改步骤

1. 调整第一步注册技术配置(LocalAccountSignUpWithLogonEmail)

保留邮箱、密码的收集逻辑和邮箱唯一性校验,移除账户创建的验证配置:

<TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
  <DisplayName>Email signup</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="IpAddressClaimReferenceId">IpAddress</Item>
    <Item Key="ContentDefinitionReferenceId">api.localaccountsignup</Item>
    <Item Key="language.button_continue">Continue</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
  </CryptographicKeys>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="email" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="objectId" />
    <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
    <OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
    <OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
    <OutputClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" DefaultValue="true" />
    <OutputClaim ClaimTypeReferenceId="authenticationSource" />
    <OutputClaim ClaimTypeReferenceId="newUser" />
  </OutputClaims>
  <ValidationTechnicalProfiles>
    <!-- 仅保留邮箱唯一性校验,防止重复注册 -->
    <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress" />
  </ValidationTechnicalProfiles>
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>

2. 创建第二步用户信息收集技术配置

新增一个自我断言技术配置,用于收集用户名等附加信息,并在验证阶段执行账户创建:

<TechnicalProfile Id="LocalAccountSignUpProfileDetails">
  <DisplayName>Complete Your Profile</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ContentDefinitionReferenceId">api.selfasserted</Item>
    <Item Key="language.button_continue">Create Account</Item>
  </Metadata>
  <InputClaims>
    <!-- 承接第一步已验证的邮箱 -->
    <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" />
  </InputClaims>
  <OutputClaims>
    <!-- 定义需要收集的用户属性,按需调整 -->
    <OutputClaim ClaimTypeReferenceId="givenName" Required="true" />
    <OutputClaim ClaimTypeReferenceId="surName" Required="true" />
    <OutputClaim ClaimTypeReferenceId="displayName" Required="true" />
  </OutputClaims>
  <ValidationTechnicalProfiles>
    <!-- 在这里执行账户创建操作 -->
    <ValidationTechnicalProfile ReferenceId="AAD-UserWriteUsingLogonEmail" />
  </ValidationTechnicalProfiles>
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>

3. 更新用户旅程,串联两步流程

修改用户旅程,确保先执行第一步邮箱密码收集,再执行第二步信息完善与账户创建:

<UserJourney Id="SignUp">
  <OrchestrationSteps>
    <!-- 步骤1:收集邮箱、密码并校验唯一性 -->
    <OrchestrationStep Order="1" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="FirstSignUpStep" TechnicalProfileReferenceId="LocalAccountSignUpWithLogonEmail" />
      </ClaimsExchanges>
    </OrchestrationStep>
    <!-- 步骤2:收集用户信息并创建账户 -->
    <OrchestrationStep Order="2" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="SecondSignUpStep" TechnicalProfileReferenceId="LocalAccountSignUpProfileDetails" />
      </ClaimsExchanges>
    </OrchestrationStep>
    <!-- 步骤3:发行身份令牌 -->
    <OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
  </OrchestrationSteps>
  <ClientDefinition ReferenceId="DefaultWeb" />
</UserJourney>

4. 确保账户创建技术配置接收所有必需属性

检查AAD-UserWriteUsingLogonEmail的输入和持久化声明,确保包含第一步的邮箱、密码,以及第二步收集的用户属性:

<TechnicalProfile Id="AAD-UserWriteUsingLogonEmail">
  <Metadata>
    <Item Key="Operation">Write</Item>
    <Item Key="RaiseErrorIfClaimsPrincipalAlreadyExists">true</Item>
  </Metadata>
  <IncludeInSso>false</IncludeInSso>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="signInNames.emailAddress" Required="true" />
    <InputClaim ClaimTypeReferenceId="newPassword" PartnerClaimType="password" Required="true" />
    <InputClaim ClaimTypeReferenceId="displayName" />
    <InputClaim ClaimTypeReferenceId="givenName" />
    <InputClaim ClaimTypeReferenceId="surName" />
  </InputClaims>
  <PersistedClaims>
    <PersistedClaim ClaimTypeReferenceId="email" PartnerClaimType="signInNames.emailAddress" />
    <PersistedClaim ClaimTypeReferenceId="newPassword" PartnerClaimType="password" />
    <PersistedClaim ClaimTypeReferenceId="displayName" />
    <PersistedClaim ClaimTypeReferenceId="givenName" />
    <PersistedClaim ClaimTypeReferenceId="surName" />
    <PersistedClaim ClaimTypeReferenceId="objectId" />
    <PersistedClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="localAccountAuthentication" />
    <PersistedClaim ClaimTypeReferenceId="newUser" />
    <PersistedClaim ClaimTypeReferenceId="userPrincipalName" />
    <PersistedClaim ClaimTypeReferenceId="ipAddress" />
  </PersistedClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="objectId" />
    <OutputClaim ClaimTypeReferenceId="newUser" />
  </OutputClaims>
  <IncludeTechnicalProfile ReferenceId="AAD-Common" />
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>

关键注意点

  • 第一步必须保留AAD-UserReadUsingEmailAddress校验,避免用户注册已存在的邮箱。
  • 第二步的输入声明要正确引用第一步的已验证邮箱,确保数据传递无误。
  • 所有需要收集的用户属性,必须在策略的<ClaimTypes>节点中提前定义。

内容的提问来源于stack exchange,提问作者Chaitu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:30:41