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

如何在Azure B2C中不中断流程展示REST调用返回的错误消息

核心问题说明

你当前的配置存在两点问题,导致无论API返回什么状态码都会触发错误:

  1. REST技术配置未指定输出声明,也未关闭默认错误抛出逻辑,只要接口返回内容不符合B2C预期(哪怕是200状态码)都会判定为调用失败
  2. 直接将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:18:02