如何在Azure B2C中不中断流程展示REST调用返回的错误消息
核心问题说明
你当前的配置存在两点问题,导致无论API返回什么状态码都会触发错误:
- REST技术配置未指定输出声明,也未关闭默认错误抛出逻辑,只要接口返回内容不符合B2C预期(哪怕是200状态码)都会判定为调用失败
- 直接将REST接口作为自断言页面的验证技术配置,未增加条件判断,只要调用被判定为失败就会直接抛出表单错误
调整步骤
1. 新增需要用到的自定义声明
在你的策略的BuildingBlocks/ClaimsSchema节点下新增以下声明:
<ClaimType Id="isMemberValid"> <DisplayName>会员校验是否通过</DisplayName> <DataType>boolean</DataType> </ClaimType> <ClaimType Id="memberErrorMessage"> <DisplayName>会员校验错误信息</DisplayName> <DataType>string</DataType> </ClaimType>
2. 修改REST接口技术配置
调整REST-CheckMemberAccountHolder的配置,新增输出声明,关闭默认全局错误抛出:
<TechnicalProfile Id="REST-CheckMemberAccountHolder"> <DisplayName>Rest API call to Check Member status</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">API</Item> <Item Key="SendClaimsIn">QueryString</Item> <Item Key="AuthenticationType">None</Item> <Item Key="AllowInsecureAuthInProduction">true</Item> <!-- 新增以下两个配置,关闭默认错误抛出 --> <Item Key="ContinueOnError">true</Item> <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">false</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="emailaddress"/> </InputClaims> <!-- 新增输出声明,接收API返回的校验结果 --> <OutputClaims> <OutputClaim ClaimTypeReferenceId="isMemberValid" /> <OutputClaim ClaimTypeReferenceId="memberErrorMessage" /> </OutputClaims> </TechnicalProfile>
3. 调整自断言收集器的验证逻辑
修改MemberAccountHolderCollector的验证技术配置,增加条件判断,只有校验不通过时才抛出错误:
<TechnicalProfile Id="MemberAccountHolderCollector"> <DisplayName>Verify member status</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.register</Item> <Item Key="setting.showContinueButton">No</Item> </Metadata> <OutputClaims> <OutputClaim ClaimTypeReferenceId="requireRegistration" DefaultValue="false" /> <OutputClaim ClaimTypeReferenceId="email" /> </OutputClaims> <ValidationTechnicalProfiles> <!-- 首先调用REST接口,允许出错继续执行 --> <ValidationTechnicalProfile ReferenceId="REST-CheckMemberAccountHolder" ContinueOnError="true" /> <!-- 新增断言校验,只有会员校验不通过时才抛出错误 --> <ValidationTechnicalProfile ReferenceId="Assert-MemberStatusIsValid" /> </ValidationTechnicalProfiles> </TechnicalProfile>
4. 新增断言校验技术配置和声明转换
首先在BuildingBlocks/ClaimsTransformations节点下新增断言逻辑:
<ClaimsTransformation Id="ThrowIfMemberInvalid" TransformationMethod="AssertBooleanClaimIsEqualToValue"> <InputClaims> <InputClaim ClaimTypeReferenceId="isMemberValid" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="valueToCompareTo" DataType="boolean" Value="true" /> <InputParameter Id="throwError" DataType="boolean" Value="true" /> <!-- 这里可以直接写固定错误,也可以改成用memberErrorMessage声明的动态值 --> <InputParameter Id="errorMessage" DataType="string" Value="当前邮箱不属于有效会员账号" /> </InputParameters> </ClaimsTransformation>
然后在声明提供器节点下新增断言技术配置:
<ClaimsProvider> <DisplayName>会员状态断言校验</DisplayName> <TechnicalProfiles> <TechnicalProfile Id="Assert-MemberStatusIsValid"> <DisplayName>校验会员状态是否有效</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="ThrowIfMemberInvalid" /> </OutputClaimsTransformations> </TechnicalProfile> </TechnicalProfiles> </ClaimsProvider>
5. 调整API返回格式
要求你的后端API无论校验是否通过都返回200状态码,避免触发B2C默认的接口调用失败判定:
- 校验通过返回:
{"isMemberValid": true} - 校验不通过返回:
{"isMemberValid": false, "memberErrorMessage": "自定义错误内容"}
内容的提问来源于stack exchange,提问作者Bnd10706
相关产品推荐
相关产品推荐

