Azure AD B2C自定义策略:不同验证技术配置文件能否显示不同错误消息?
问题描述
我有一个包含两个验证技术配置文件的技术配置文件TechnicalProfile1,配置如下:
<TechnicalProfile Id="TechnicalProfile1"> ... <ValidationTechnicalProfiles> <ValidationTechnicalProfile ReferenceId="Validation1" ContinueOnSuccess="true" ContinueOnError="false" /> <ValidationTechnicalProfile ReferenceId="Validation2" ContinueOnSuccess="true" ContinueOnError="false" /> </ValidationTechnicalProfiles> </TechnicalProfile>
这两个验证技术配置文件均执行AssertStringClaimsAreEqual声明转换,当声明不相等时会终止策略执行并向用户显示错误消息,各自配置如下:
<TechnicalProfile Id="Validation1"> ... <Metadata> <Item Key="UserMessageIfClaimsTransformationStringsAreNotEqual">Message #1</Item> </Metadata> ... <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="Assert1" /> </OutputClaimsTransformations> </TechnicalProfile> <TechnicalProfile Id="Validation2"> ... <Metadata> <Item Key="UserMessageIfClaimsTransformationStringsAreNotEqual">Message #2</Item> </Metadata> ... <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="Assert2" /> </OutputClaimsTransformations> </TechnicalProfile>
尽管每个验证技术配置文件都有独立的用户消息元数据项,但验证失败时这些消息并未显示。目前仅能在父技术配置文件中添加消息元数据项来显示通用错误消息,无法告知用户具体失败原因。根据官方文档,此行为符合预期,但想了解是否有办法根据验证失败的具体配置显示不同的错误消息。
可行解决方案
要实现验证失败时显示对应自定义错误消息,可通过以下两种方式处理:
1. 为每个验证技术配置文件单独设置错误处理逻辑
将每个验证技术配置文件的ContinueOnError设为true,同时在每个验证TP中添加自定义错误代码,再在父TP中映射对应错误代码的消息:
修改验证TP配置
<TechnicalProfile Id="Validation1"> ... <Metadata> <!-- 指定自定义错误代码 --> <Item Key="UserMessageIfClaimsTransformationStringsAreNotEqual">CustomError1</Item> <!-- 开启错误继续,让父TP捕获错误 --> <Item Key="ContinueOnError">true</Item> </Metadata> ... <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="Assert1" /> </OutputClaimsTransformations> </TechnicalProfile> <TechnicalProfile Id="Validation2"> ... <Metadata> <Item Key="UserMessageIfClaimsTransformationStringsAreNotEqual">CustomError2</Item> <Item Key="ContinueOnError">true</Item> </Metadata> ... <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="Assert2" /> </OutputClaimsTransformations> </TechnicalProfile>
在父TP中映射错误消息
在TechnicalProfile1的元数据中添加对应错误代码的消息映射:
<TechnicalProfile Id="TechnicalProfile1"> ... <Metadata> <Item Key="UserMessageIfCustomError1">Message #1</Item> <Item Key="UserMessageIfCustomError2">Message #2</Item> </Metadata> <ValidationTechnicalProfiles> <ValidationTechnicalProfile ReferenceId="Validation1" ContinueOnSuccess="true" ContinueOnError="true" /> <ValidationTechnicalProfile ReferenceId="Validation2" ContinueOnSuccess="true" ContinueOnError="true" /> </ValidationTechnicalProfiles> </TechnicalProfile>
2. 将断言转换直接嵌入父TP,通过错误代码区分
放弃使用验证TP,直接在TechnicalProfile1中添加两个断言转换,为每个转换指定唯一错误代码后映射对应消息:
修改父TP配置
<TechnicalProfile Id="TechnicalProfile1"> ... <Metadata> <Item Key="UserMessageIfAssert1Failed">Message #1</Item> <Item Key="UserMessageIfAssert2Failed">Message #2</Item> </Metadata> ... <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="Assert1" /> <OutputClaimsTransformation ReferenceId="Assert2" /> </OutputClaimsTransformations> </TechnicalProfile>
修改断言转换配置
为每个断言转换指定自定义错误代码:
<ClaimsTransformation Id="Assert1" TransformationMethod="AssertStringClaimsAreEqual"> <InputClaims> <InputClaim ClaimTypeReferenceId="claimA" TransformationClaimType="inputClaim1" /> <InputClaim ClaimTypeReferenceId="claimB" TransformationClaimType="inputClaim2" /> </InputClaims> <InputParameters> <InputParameter Id="errorMessage" DataType="string" Value="Assert1Failed" /> </InputParameters> </ClaimsTransformation> <ClaimsTransformation Id="Assert2" TransformationMethod="AssertStringClaimsAreEqual"> <InputClaims> <InputClaim ClaimTypeReferenceId="claimC" TransformationClaimType="inputClaim1" /> <InputClaim ClaimTypeReferenceId="claimD" TransformationClaimType="inputClaim2" /> </InputClaims> <InputParameters> <InputParameter Id="errorMessage" DataType="string" Value="Assert2Failed" /> </InputParameters> </ClaimsTransformation>
内容的提问来源于stack exchange,提问作者Danny Idlis
相关产品推荐
相关产品推荐

