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

如何在Azure AD B2C后续编排步骤中展示自定义REST API返回的错误?

如何在Azure AD B2C自定义策略中捕获REST API错误并控制后续编排步骤

要实现你的需求,我们需要通过配置REST技术配置文件捕获错误声明、使用ClaimsTransformation设置控制标志,再在错误页面技术配置中展示自定义错误消息。下面是分步实现方案:

1. 更新REST技术配置文件,捕获错误信息

首先修改你的REST-ValidateSignInEmail技术配置文件,添加元数据让B2C自动捕获API返回的错误代码和消息,并将这些信息存入指定声明:

<TechnicalProfile Id="REST-ValidateSignInEmail">
  <DisplayName>Validate Sign-In Email via REST API</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <!-- 保留原有元数据,新增以下两项 -->
    <!-- 指定存储HTTP错误状态码的声明 -->
    <Item Key="ResponseErrorCodeClaimType">extension_ErrorStatusCode</Item>
    <!-- 指定存储自定义错误消息的声明 -->
    <Item Key="ResponseErrorMessageClaimType">extension_UserMessage</Item>
    <!-- 测试环境可开启,生产环境请移除 -->
    <Item Key="AllowInsecureAuthInProduction">false</Item>
  </Metadata>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
  </InputClaims>
  <OutputClaims>
    <!-- 输出捕获到的错误信息 -->
    <OutputClaim ClaimTypeReferenceId="extension_ErrorStatusCode" />
    <OutputClaim ClaimTypeReferenceId="extension_UserMessage" />
  </OutputClaims>
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>

这里的元数据会让B2C自动把API返回的409状态码存入extension_ErrorStatusCode,把你API中定义的UserMessage存入extension_UserMessage。

2. 定义ClaimsTransformation设置控制标志

添加一个ClaimsTransformation规则,当错误状态码等于409时,将extension_Flag设为True:

<ClaimsTransformations>
  <ClaimsTransformation Id="SetFlagOnConflictError" TransformationMethod="CompareClaimValue">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="extension_ErrorStatusCode" TransformationClaimType="inputClaim" />
    </InputClaims>
    <InputParameters>
      <InputParameter Id="compareTo" DataType="string" Value="409" />
      <InputParameter Id="outputClaimIfEqual" DataType="boolean" Value="true" />
      <InputParameter Id="outputClaimIfNotEqual" DataType="boolean" Value="false" />
    </InputParameters>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="extension_Flag" TransformationClaimType="outputClaim" />
    </OutputClaims>
  </ClaimsTransformation>
</ClaimsTransformations>

再创建一个执行该转换的技术配置文件:

<TechnicalProfile Id="TP-SetErrorFlag">
  <DisplayName>Set Error Flag Based on REST Response</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="extension_Flag" />
  </OutputClaims>
  <ClaimsTransformations>
    <ClaimsTransformationReferenceId="SetFlagOnConflictError" />
  </ClaimsTransformations>
</TechnicalProfile>

3. 调整编排步骤逻辑

修改编排步骤顺序,先执行REST调用,再设置错误标志,最后根据标志判断是否显示错误页面:

<!-- 步骤3:调用REST API验证邮箱 -->
<OrchestrationStep Order="3" Type="ClaimsExchange">
  <ClaimsExchanges>
    <ClaimsExchange Id="REST-ValidateSignInEmail" TechnicalProfileReferenceId="REST-ValidateSignInEmail" />
  </ClaimsExchanges>
</OrchestrationStep>

<!-- 步骤4:根据REST错误设置控制标志 -->
<OrchestrationStep Order="4" Type="ClaimsExchange">
  <ClaimsExchanges>
    <ClaimsExchange Id="SetErrorFlag" TechnicalProfileReferenceId="TP-SetErrorFlag" />
  </ClaimsExchanges>
</OrchestrationStep>

<!-- 步骤5:显示自定义错误页面(仅当标志为True时执行) -->
<OrchestrationStep Order="5" Type="ClaimsExchange">
  <Preconditions>
    <Precondition Type="ClaimEquals" ExecuteActionsIf="false">
      <Value>extension_Flag</Value>
      <Value>True</Value>
      <Action>SkipThisOrchestrationStep</Action>
    </Precondition>
  </Preconditions>
  <ClaimsExchanges>
    <ClaimsExchange Id="SelfAssertedRegError" TechnicalProfileReferenceId="SelfAsserted-RegError" />
  </ClaimsExchanges>
</OrchestrationStep>

这里调整了原有步骤的顺序,新增步骤4专门处理标志设置,同时修改了Precondition逻辑:只有当extension_Flag为True时,才会执行错误页面步骤。

4. 更新错误页面技术配置,展示自定义消息

修改SelfAsserted-RegError技术配置文件,将捕获到的错误消息展示给用户:

<TechnicalProfile Id="SelfAsserted-RegError">
  <DisplayName>Custom Error Page</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.error</Item>
    <Item Key="showContinueButton">false</Item>
  </Metadata>
  <OutputClaims>
    <!-- 显示自定义错误消息 -->
    <OutputClaim ClaimTypeReferenceId="extension_UserMessage" Required="true" />
  </OutputClaims>
</TechnicalProfile>

同时确保你在ContentDefinitions中定义了对应的错误页面:

<ContentDefinition Id="api.selfasserted.error">
  <LoadUri>https://your-custom-error-page-url.com/error.html</LoadUri>
  <RecoveryUri>~/common/default_page_error.html</RecoveryUri>
  <DataUri>urn:com:microsoft:aad:b2c:elements:selfasserted:1.1.0</DataUri>
  <Metadata>
    <Item Key="DisplayName">Custom Error Page</Item>
  </Metadata>
</ContentDefinition>

在你的自定义HTML页面中,可通过{extension_UserMessage}占位符渲染错误消息。

前置准备:声明定义

最后,确保你在BuildingBlocks的ClaimSchema中定义了这些扩展声明:

<ClaimSchema>
  <ClaimType Id="extension_ErrorStatusCode">
    <DisplayName>Error Status Code</DisplayName>
    <DataType>string</DataType>
  </ClaimType>
  <ClaimType Id="extension_UserMessage">
    <DisplayName>User Friendly Error Message</DisplayName>
    <DataType>string</DataType>
  </ClaimType>
  <ClaimType Id="extension_Flag">
    <DisplayName>Error Flag</DisplayName>
    <DataType>boolean</DataType>
  </ClaimType>
</ClaimSchema>

这样配置后,当REST API返回409 Conflict时,B2C会自动捕获错误信息并设置标志,触发自定义错误页面展示你定义的消息,而不是跳转到默认的B2C错误URL。

内容的提问来源于stack exchange,提问作者Leniel Maccaferri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:41:54