Azure B2C自定义策略中如何条件转换signInName声明
可以通过Azure B2C自定义策略实现该需求
你的核心需求是在登录环节收集signInName后、验证前,对手机号格式进行标准化(比如去除空格),这个场景完全可以通过自定义策略实现。当前配置的问题在于转换逻辑的执行顺序有误,调整后即可生效。
问题分析
你当前的NormalizePhoneNumberProfile使用了OutputClaimsTransformations,这会在输出声明之后执行转换,无法修改输入的原始signInName。应该改用InputClaimsTransformations,先对输入的signInName执行格式转换,再输出标准化后的声明。
修正后的配置
1. 调整NormalizePhoneNumberProfile
<TechnicalProfile Id="NormalizePhoneNumberProfile"> <DisplayName>Normalize Phone Number</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <InputClaims> <InputClaim ClaimTypeReferenceId="signInName" /> </InputClaims> <!-- 先转换输入的signInName,再输出 --> <InputClaimsTransformations> <InputClaimsTransformation ReferenceId="NormalizePhoneNumber" /> </InputClaimsTransformations> <OutputClaims> <OutputClaim ClaimTypeReferenceId="signInName" /> </OutputClaims> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile>
2. 确认格式转换逻辑
你的NormalizePhoneNumber声明转换配置是正确的,若后续需要处理其他格式(比如连字符-),可以添加多个StringReplace转换,或者改用RegexReplace实现更灵活的标准化:
<!-- 示例:同时去除空格和连字符 --> <ClaimsTransformation Id="NormalizePhoneNumber" TransformationMethod="RegexReplace"> <InputClaims> <InputClaim ClaimTypeReferenceId="signInName" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="regex" DataType="string" Value="[\s-]" /> <InputParameter Id="replacement" DataType="string" Value="" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="signInName" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
3. 确保手机号识别逻辑正确
需保证regexAnalysisUsername技术配置文件能正确区分邮箱和手机号,通过isEmailBoolean声明触发后续的标准化流程。例如通过正则匹配邮箱格式来设置isEmailBoolean:
<ClaimsTransformation Id="IsEmail" TransformationMethod="StringMatches"> <InputClaims> <InputClaim ClaimTypeReferenceId="signInName" TransformationClaimType="inputClaim" /> </InputClaims> <InputParameters> <InputParameter Id="regex" DataType="string" Value="^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$" /> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="isEmailBoolean" TransformationClaimType="outputClaim" /> </OutputClaims> </ClaimsTransformation>
验证流程
调整后,登录流程会按以下顺序执行:
- 用户输入
signInName(邮箱或带空格的手机号) regexAnalysisUsername识别输入类型,设置isEmailBoolean- 若为手机号(
isEmailBoolean为False),执行NormalizePhoneNumberProfile标准化格式 - 使用标准化后的
signInName执行login-NonInteractive验证
内容的提问来源于stack exchange,提问作者user1967060
相关产品推荐
相关产品推荐

