如何在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

