基于LocalAccount Starter Pack的Azure AD B2C无密码自定义政策问题
解决Azure AD B2C无密码自定义政策的核心问题
你的场景与问题
- 基础政策基于LocalAccount Starter Pack,参考SocialAndLocalAccount Starter Pack的无密码流程改造
- 遇到两个问题:
- 移除用户旅程中Order=3、4、6的步骤后,登录触发声明错误
- 未知用户登录时未提示“用户不存在”,反而直接发送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是因为跳过了用户存在性判断,要在用户旅程中加入前置检查:
- 在
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
相关产品推荐
相关产品推荐

