如何实现B2C Custom Policy登录时校验case ref、Ni Number自定义属性
Azure AD B2C 自定义策略校验方案
完全可以通过内置的技术验证配置文件(Technical Validation Profile)实现你需要的用户属性校验逻辑,无需调用外部API,具体实现步骤如下:
前置准备
你已经完成了预创建带自定义属性的用户步骤,只需确保自定义属性在策略的ClaimsSchema节点中正确声明即可,示例声明如下:
<ClaimsSchema> <ClaimType Id="extension_CaseReference"> <DisplayName>Case Reference</DisplayName> <DataType>string</DataType> <UserInputType>TextBox</UserInputType> </ClaimType> <ClaimType Id="extension_NiNumber"> <DisplayName>NI Number</DisplayName> <DataType>string</DataType> <UserInputType>TextBox</UserInputType> </ClaimType> <!-- 额外声明用户输入用的临时字段 --> <ClaimType Id="inputCaseReference"> <DisplayName>Case Reference</DisplayName> <DataType>string</DataType> <UserInputType>TextBox</UserInputType> </ClaimType> <ClaimType Id="inputNiNumber"> <DisplayName>NI Number</DisplayName> <DataType>string</DataType> <UserInputType>TextBox</UserInputType> </ClaimType> </ClaimsSchema>
步骤1:修改自断言登录页配置
在你的登录页对应的自断言技术配置文件中,新增三个必填输入项,同时添加校验流程:
<TechnicalProfile Id="SelfAsserted-Login"> <DisplayName>Login 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.login</Item> <!-- 关闭注册入口 --> <Item Key="SignUpTarget">None</Item> </Metadata> <OutputClaims> <OutputClaim ClaimTypeReferenceId="signInName" DisplayName="Email" Required="true" /> <OutputClaim ClaimTypeReferenceId="inputCaseReference" DisplayName="Case Reference" Required="true" /> <OutputClaim ClaimTypeReferenceId="inputNiNumber" DisplayName="NI Number" Required="true" /> </OutputClaims> <ValidationTechnicalProfiles> <!-- 第一步:通过用户输入的邮箱读取租户内存储的用户属性 --> <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress"> <InputClaims> <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="signInNames.emailAddress" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="extension_CaseReference" /> <OutputClaim ClaimTypeReferenceId="extension_NiNumber" /> </OutputClaims> </ValidationTechnicalProfile> <!-- 第二步:比对用户输入值和租户存储的属性值 --> <ValidationTechnicalProfile ReferenceId="Assert-UserAttributesMatch" /> </ValidationTechnicalProfiles> </TechnicalProfile>
步骤2:编写属性比对技术配置文件
新增断言技术配置文件,使用内置的声明转换完成值比对,不匹配时直接抛出错误:
<TechnicalProfile Id="Assert-UserAttributesMatch"> <DisplayName>Validate Case Reference and NI Number</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <OutputClaimsTransformations> <!-- 比对Case Reference --> <OutputClaimsTransformation ReferenceId="CheckCaseReferenceMatch" /> <!-- 比对NI Number --> <OutputClaimsTransformation ReferenceId="CheckNiNumberMatch" /> </OutputClaimsTransformations> </TechnicalProfile>
对应的声明转换示例:
<ClaimsTransformation Id="CheckCaseReferenceMatch" TransformationMethod="AssertStringClaimsAreEqual"> <InputClaims> <InputClaim ClaimTypeReferenceId="inputCaseReference" TransformationClaimType="inputClaim1" /> <InputClaim ClaimTypeReferenceId="extension_CaseReference" TransformationClaimType="inputClaim2" /> </InputClaims> <InputParameters> <InputParameter Id="stringComparison" DataType="string" Value="OrdinalIgnoreCase" /> <InputParameter Id="throwErrorIfNotEqual" DataType="boolean" Value="true" /> <InputParameter Id="errorMessage" DataType="string" Value="Case Reference does not match our records." /> </InputParameters> </ClaimsTransformation> <!-- 复制上述逻辑修改字段名即可完成NI Number的比对配置 -->
注意事项
- 确保你的B2C策略服务主体已被授予用户读取权限,否则无法拉取用户的自定义属性
- 自定义属性的
extension_前缀后的字符串要和你租户中注册应用的应用ID(去掉短横线)一致,否则无法正确读取属性 - 所有错误提示可通过
Localization节点自定义本地化文案
内容的提问来源于stack exchange,提问作者72GM
相关产品推荐
相关产品推荐

