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

基于LocalAccount Starter Pack的Azure AD B2C无密码自定义政策问题

解决Azure AD B2C无密码自定义政策的核心问题

你的场景与问题

  • 基础政策基于LocalAccount Starter Pack,参考SocialAndLocalAccount Starter Pack的无密码流程改造
  • 遇到两个问题:
    1. 移除用户旅程中Order=3、4、6的步骤后,登录触发声明错误
    2. 未知用户登录时未提示“用户不存在”,反而直接发送OTP

一、修复移除步骤后的声明错误

LocalAccount和SocialAndLocalAccount的政策逻辑有差异,直接照搬示例的步骤移除会丢失关键声明,正确的调整方式:

  • 必须保留Order=3的AAD-UserReadUsingEmailAddress:这一步是通过邮箱查询用户信息,获取objectId等核心声明,删除后后续步骤会因缺失声明报错
  • 移除Order=2的PasswordVerification(无密码流程不需要密码验证)
  • 将Order=4的AAD-UserWriteUsingLogonEmail(注册流程用的写用户操作)替换为无密码OTP发送的技术配置,比如PhoneFactor-Email(对应你参考示例里的OTP发送步骤)
  • 保留Order=5的PhoneFactor-Verify(验证OTP的核心步骤)
  • Order=6的AAD-UserReadUsingObjectId可删,但要确保AAD-UserReadUsingEmailAddress已经获取了所有需要的用户声明

关键逻辑:无密码登录的核心依赖是先通过邮箱找到用户,再发OTP验证,不能跳过用户查询步骤。


二、修复未知用户未提示的问题

未知用户发OTP是因为跳过了用户存在性判断,要在用户旅程中加入前置检查:

  1. 在AAD-UserReadUsingEmailAddress执行后,添加判断逻辑:
    • 如果objectId声明不存在(说明用户未注册),跳转到自定义错误页提示“用户不存在”
    • 如果objectId存在,继续执行OTP发送步骤

具体配置示例

在用户旅程的OrchestrationSteps中添加以下步骤:

<!-- 检查用户是否存在,不存在则跳错误页 -->
<OrchestrationStep Order="4" Type="ClaimsExchange">
  <Preconditions>
    <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
      <Value>objectId</Value>
      <Action>SkipThisOrchestrationStep</Action>
    </Precondition>
  </Preconditions>
  <ClaimsExchanges>
    <ClaimsExchange Id="UserNotFoundError" TechnicalProfileReferenceId="SelfAsserted-UserNotFound" />
  </ClaimsExchanges>
</OrchestrationStep>

然后创建对应的错误提示技术配置:

<TechnicalProfile Id="SelfAsserted-UserNotFound">
  <DisplayName>用户不存在提示</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.error</Item>
    <Item Key="UserMessageIfClaimsPrincipalDoesNotExist">用户不存在,请先注册账号。</Item>
  </Metadata>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="email" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="email" />
  </OutputClaims>
</TechnicalProfile>

新手避坑提示

  • 每次修改政策后先在测试环境验证,不要直接发布到生产
  • 检查每个技术配置的声明依赖,确保前序步骤已收集所需的所有声明
  • 参考官方示例时,注意区分LocalAccount和SocialAndLocalAccount的流程差异,不要盲目复制社交账户相关逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:47:24