如何有条件地转换 Azure B2C 自定义策略中的 SignInName 声明

问题描述 投票:0回答:1

我需要能够使用电子邮件和电话号码以及常规密码(不是 OTP)登录 azure B2C。我不想使用 OTP 短信,因为我需要双因素登录,而 OTP 是第二个因素。

我认为我能够根据用户名或电子邮件示例来实现这一目标。我想要一个电话号码作为用户名。我已经解决了一个注册案例,但我专注于登录。在收集 singInName 之后和发送验证之前,是否有任何选项可以使用 StringReplace 转换signInName?

我尝试建立一个技术配置文件,将用户名从以下位置转换: 7900 654321 至 7900654321(用空字符串替换空格)。我尝试通过以下政策来实现这一目标:

<TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Email">
    <Metadata>
        <Item Key="setting.forgotPasswordLinkOverride">ForgotPasswordExchange</Item>
    </Metadata>
    <ValidationTechnicalProfiles>
        <ValidationTechnicalProfile ReferenceId="regexAnalysisUsername" />

        <ValidationTechnicalProfile ReferenceId="NormalizePhoneNumberProfile"
            ContinueOnError="false">
            <Preconditions>
                <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                    <Value>isEmailBoolean</Value>
                    <Value>True</Value>
                    <Action>SkipThisValidationTechnicalProfile</Action>
                </Precondition>
            </Preconditions>
        </ValidationTechnicalProfile>
        <!-- Initiate a normal logon against Azure AD B2C -->
        <ValidationTechnicalProfile ReferenceId="login-NonInteractive" />
    </ValidationTechnicalProfiles>
</TechnicalProfile>

<TechnicalProfile Id="NormalizePhoneNumberProfile">
    <DisplayName>extract username</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>
    <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="signInName" />
    </OutputClaims>
    <OutputClaimsTransformations>
        <OutputClaimsTransformation ReferenceId="NormalizePhoneNumber" />
    </OutputClaimsTransformations>
    <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>

变换如下:

<ClaimsTransformation Id="NormalizePhoneNumber" TransformationMethod="StringReplace">
    <InputClaims>
        <InputClaim ClaimTypeReferenceId="signInName" TransformationClaimType="inputClaim" />
    </InputClaims>
    <InputParameters>
        <InputParameter Id="oldValue" DataType="string" Value=" " />
        <InputParameter Id="newValue" DataType="string" Value="" />
    </InputParameters>
    <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="signInName" TransformationClaimType="outputClaim" />
    </OutputClaims>
</ClaimsTransformation>

是否可以通过自定义策略来实现这一目标?

azure azure-ad-b2c azure-ad-b2c-custom-policy
1个回答
0
投票

实现您的要求/转换的最简单方法是通过对声明使用正则表达式限制来防止用户在

signInName
字段中输入任何空格字符:

      <ClaimType Id="signInName">
        <DisplayName>Sign in name</DisplayName>
        <DataType>string</DataType>
        <UserHelpText/>
        <UserInputType>TextBox</UserInputType>
        <Restriction>
          <Pattern RegularExpression="^\S+$" HelpText="Enter your email or phone number without spaces." />
        </Restriction>
      </ClaimType>
© www.soinside.com 2019 - 2024. All rights reserved.