如何自定义Azure AD B2C自定义策略中REST API调用失败的错误页面
Azure AD B2C 自定义策略REST API调用失败场景的错误页自定义方案
完全可以自定义该场景下的错误页面,根据需求不同有两种可落地的实现方式,以下是具体配置说明:
方案1:直接替换系统默认全局错误页
你看到的微软默认错误提示属于B2C的全局异常页,对应自定义策略里固定Id为api.error的内容定义,只要给该内容定义配置你自己的自定义HTML页面地址,就能全量替换所有未捕获异常(包括当前REST调用4xx/5xx失败场景)的默认错误页:
- 在自定义策略的
BuildingBlocks > ContentDefinitions节点下添加如下配置:
<ContentDefinition Id="api.error"> <!-- 替换成你自己部署的自定义错误页的公开访问地址 --> <LoadUri>https://你的存储服务地址/custom-error.html</LoadUri> <DataUri>urn:com:microsoft:aad:b2c:elements:contract:globalexception:1.2.0</DataUri> <Metadata> <Item Key="TemplateId">azureBlue</Item> </Metadata> </ContentDefinition>
- 自定义HTML页面需要符合B2C页面渲染规范,在页面正文预留
<div id="api"></div>占位节点,B2C会自动将错误信息注入该节点,你可以自由定义页面的品牌样式、导航栏、底部信息、客服入口等内容,完全覆盖默认的微软页面样式。
你当前在REST TechnicalProfile中配置的
DefaultUserMessageIfRequestFailed参数,在配置完上述自定义错误页后会自动生效,替换默认的英文错误提示文案。
方案2:捕获REST调用错误,走专属业务错误页
如果你不希望REST调用失败时跳全局通用错误页,需要根据接口返回的错误码展示不同提示、或者提供重试/返回上一步等交互能力,可以通过捕获错误声明的方式走自定义编排流程:
- 首先在策略的
ClaimsSchema节点下提前定义两个字段,用于接收REST接口返回的错误信息:
<ClaimType Id="restErrorCode"> <DisplayName>REST接口错误码</DisplayName> <DataType>string</DataType> </ClaimType> <ClaimType Id="restErrorMessage"> <DisplayName>REST接口错误信息</DisplayName> <DataType>string</DataType> </ClaimType>
- 修改你当前的REST调用TechnicalProfile,补充元数据配置和输出声明映射,接住接口返回的错误内容:
<TechnicalProfile Id="Some-Rest API"> <DisplayName>REST call</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">https://{url}</Item> <Item Key="AuthenticationType">Bearer</Item> <Item Key="SendClaimsIn">Url</Item> <Item Key="UseClaimAsBearerToken">token</Item> <Item Key="IncludeClaimResolvingInClaimsHandling">true</Item> <Item Key="AllowInsecureAuthInProduction">false</Item> <Item Key="DefaultUserMessageIfRequestFailed">Unable to Process your Request</Item> <!-- 新增以下两个配置 --> <Item Key="ResolveJsonPathsInJsonTokens">true</Item> <Item Key="RaiseErrorIfClaimsExchangeFailed">false</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="token" /> <InputClaim ClaimTypeReferenceId="objectId" /> </InputClaims> <!-- 新增输出声明,映射REST接口错误响应体里的字段 --> <OutputClaims> <!-- PartnerClaimType对应你的REST接口4xx/5xx响应里的错误码字段名 --> <OutputClaim ClaimTypeReferenceId="restErrorCode" PartnerClaimType="code" DefaultValue="" /> <!-- PartnerClaimType对应你的REST接口4xx/5xx响应里的错误提示字段名 --> <OutputClaim ClaimTypeReferenceId="restErrorMessage" PartnerClaimType="message" DefaultValue="" /> </OutputClaims> </TechnicalProfile>
- 在REST调用的编排步骤(Order=5)之后,新增一个编排步骤,通过声明转换判断REST调用是否出错,如果出错就跳转到你自定义的自断言错误页面,在该页面中你可以自由配置展示内容、交互按钮,不需要受全局错误页的限制。
注意事项
- 方案1配置简单,适合只需要统一品牌视觉、不需要针对REST错误做特殊交互的场景,配置后所有B2C流程的未捕获异常都会展示该自定义页面。
- 方案2灵活性更高,适合需要针对当前REST接口错误做精细化提示、业务跳转的场景,不会触发全局异常页。
- 所有自定义HTML页面必须开启CORS允许你的B2C租户域名跨域访问,否则B2C无法正常加载页面。
内容的提问来源于stack exchange,提问作者Amit Mondal
相关产品推荐
相关产品推荐

