You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

验证流程

调整后,登录流程会按以下顺序执行:

  1. 用户输入signInName(邮箱或带空格的手机号)
  2. regexAnalysisUsername识别输入类型,设置isEmailBoolean
  3. 若为手机号(isEmailBoolean为False),执行NormalizePhoneNumberProfile标准化格式
  4. 使用标准化后的signInName执行login-NonInteractive验证

内容的提问来源于stack exchange,提问作者user1967060

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:27:34