Azure AD B2C自定义策略login-NonInteractive失败后调用REST API登录是否可行?
方案可行性确认
你要实现的无缝账号迁移需求完全可实现,当前配置未生效是对login-NonInteractive的默认错误处理逻辑认知偏差导致的:ContinueOnError="true"仅能跳过服务调用异常、参数错误等系统级错误,账号不存在、密码不匹配这类业务校验错误会被login-NonInteractive直接抛到前端终止流程,不会继续执行后续验证技术配置。
具体修改步骤
1. 新增标识本地登录结果的声明
首先在你的策略声明定义部分新增布尔类型声明:
<ClaimType Id="localLoginSucceeded"> <DisplayName>Local account login result</DisplayName> <DataType>boolean</DataType> </ClaimType>
2. 修改login-NonInteractive技术配置
关闭默认业务错误抛出逻辑,增加登录结果输出:
<TechnicalProfile Id="login-NonInteractive"> <!-- 原有配置保持不变 --> <Metadata> <!-- 原有配置项保留,新增以下两个配置 --> <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">false</Item> <Item Key="RaiseErrorIfPasswordDoesNotMatch">false</Item> </Metadata> <OutputClaims> <!-- 原有输出声明保留,新增以下两个 --> <OutputClaim ClaimTypeReferenceId="localLoginSucceeded" DefaultValue="false" AlwaysUseDefaultValue="true" /> <OutputClaim ClaimTypeReferenceId="objectId" /> </OutputClaims> <OutputClaimsTransformations> <!-- 本地登录成功时(objectId有值)修改登录结果标识 --> <OutputClaimsTransformation ReferenceId="SetLocalLoginSucceededIfObjectIdExists" /> </OutputClaimsTransformations> </TechnicalProfile>
对应新增声明转换:
<ClaimsTransformation Id="SetLocalLoginSucceededIfObjectIdExists" TransformationMethod="SetClaimIfClaimExists"> <InputClaims> <InputClaim ClaimTypeReferenceId="objectId" /> </InputClaims> <InputParameters> <InputParameter Id="ClaimToSet" DataType="string" Value="localLoginSucceeded" /> <InputParameter Id="ValueToSet" DataType="boolean" Value="true" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="localLoginSucceeded" /> </OutputClaims> </ClaimsTransformation>
3. 给REST API验证配置加前置执行条件
修改你自定义的登录技术配置中的验证技术配置段,仅当本地登录失败时才调用REST API:
<ValidationTechnicalProfiles> <ValidationTechnicalProfile ReferenceId="login-NonInteractive" ContinueOnError="true"/> <ValidationTechnicalProfile ReferenceId="UserRegistrationServiceApiLogin"> <Preconditions> <!-- 本地登录成功则跳过REST API校验 --> <Precondition Type="ClaimEquals" ExecuteActionsIf="true"> <Value>localLoginSucceeded</Value> <Value>True</Value> <Action>SkipThisValidationTechnicalProfile</Action> </Precondition> </Preconditions> </ValidationTechnicalProfile> <!-- 新增本地账号自动创建的验证技术配置,REST API校验通过后执行 --> <ValidationTechnicalProfile ReferenceId="AAD-UserCreateUsingAlternativeSecurityId"> <Preconditions> <Precondition Type="ClaimEquals" ExecuteActionsIf="true"> <Value>localLoginSucceeded</Value> <Value>True</Value> <Action>SkipThisValidationTechnicalProfile</Action> </Precondition> </Preconditions> <!-- 按你的业务需求配置输入声明,传入邮箱、密码等必要信息创建本地账号 --> </ValidationTechnicalProfile> </ValidationTechnicalProfiles>
4. 错误提示配置
在UserRegistrationServiceApiLogin技术配置中,如果旧账号校验失败,直接返回400 BadRequest,响应体按B2C规范返回错误信息即可:
{ "version": "1.0.0", "status": 400, "userMessage": "邮箱/密码无效" }
内容的提问来源于stack exchange,提问作者PaulG
相关产品推荐
相关产品推荐

