Azure ad b2c 在Azure B2C自定义策略中,如何为依赖于验证技术配置文件的验证显示2条以上不同的验证消息? 脚本

Azure ad b2c 在Azure B2C自定义策略中,如何为依赖于验证技术配置文件的验证显示2条以上不同的验证消息? 脚本,azure-ad-b2c,Azure Ad B2c,在我的注册流程中,我需要显示: 电子邮件地址字段和确认电子邮件地址字段 密码字段和确认密码字段 我必须证实: “电子邮件地址”字段中输入的文本与“确认电子邮件地址”字段中输入的文本匹配 在密码字段中输入的文本与在确认密码字段中输入的文本匹配 为用户输入的电子邮件地址在Azure B2C中不存在 这些验证应显示在现有表单中,而不是新页面中 作为验证技术配置文件输出的结果,我能够内联显示验证消息的唯一方法是使用两个内置断言,AssertStringClaimsAreEqual(用于电子邮件和

在我的注册流程中,我需要显示:

  • 电子邮件地址字段和确认电子邮件地址字段
  • 密码字段和确认密码字段
我必须证实:

  • “电子邮件地址”字段中输入的文本与“确认电子邮件地址”字段中输入的文本匹配
  • 在密码字段中输入的文本与在确认密码字段中输入的文本匹配
  • 为用户输入的电子邮件地址在Azure B2C中不存在
这些验证应显示在现有表单中,而不是新页面中

作为验证技术配置文件输出的结果,我能够内联显示验证消息的唯一方法是使用两个内置断言,AssertStringClaimsAreEqual(用于电子邮件和密码比较)和AssertBooleanClaimIsEqualToValue(用于现有用户检查)。这些导致在断言失败时显示调用声明提供程序技术配置文件中定义的消息

问题 我有三个错误案例需要不同的消息,我只能为两个案例定义和显示消息。目前,我正在通过显示“电子邮件和确认电子邮件,或密码和确认密码不匹配”来解决此问题。对于失败的文本比较和“此电子邮件地址已在使用中,请登录”。对于现有用户案例。现有的用户案例很好,但我会将单个文本比较消息描述为“好的,但实际上不符合接受标准”和“我不相信没有更好的方法来做到这一点”

在这一点上,我们将感激地接受任何帮助

当前代码段 相关验证技术概要:

    <TechnicalProfile Id="EmailMatchValidator">
      <DisplayName>Check if email and confirm email match</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
      <InputClaimsTransformations>
        <InputClaimsTransformation ReferenceId="DoEmailsMatch"/>
      </InputClaimsTransformations>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="emailsMatch" Required="true"/>
      </OutputClaims>
    </TechnicalProfile>

    <TechnicalProfile Id="PasswordMatchValidator">
      <DisplayName>Check if password and confirm password match</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
      <InputClaimsTransformations>
        <InputClaimsTransformation ReferenceId="DoPasswordsMatch"/>
      </InputClaimsTransformations>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="passwordsMatch" Required="true"/>
      </OutputClaims>
    </TechnicalProfile>

    <TechnicalProfile Id="UserExistsValidator">
      <DisplayName>Asset if user exists</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="userExists"/>
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="userExists" Required="true"/>
      </OutputClaims>
      <OutputClaimsTransformations>
        <OutputClaimsTransformation ReferenceId="DoesUserExist"/>
      </OutputClaimsTransformations>
    </TechnicalProfile>

检查电子邮件并确认电子邮件是否匹配
检查密码并确认密码匹配
资产(如果用户存在)
这些技术概要文件引用了输出声明转换,如下所示:

  <ClaimsTransformation Id="DoEmailsMatch" TransformationMethod="AssertStringClaimsAreEqual">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="inputClaim1"/>
      <InputClaim ClaimTypeReferenceId="confirmEmail" TransformationClaimType="inputClaim2"/>
    </InputClaims>
    <InputParameters>
      <InputParameter Id="stringComparison" DataType="string" Value="ordinalIgnoreCase"/>
    </InputParameters>
  </ClaimsTransformation>

  <ClaimsTransformation Id="DoPasswordsMatch" TransformationMethod="AssertStringClaimsAreEqual">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="password" TransformationClaimType="inputClaim1"/>
      <InputClaim ClaimTypeReferenceId="confirmpassword" TransformationClaimType="inputClaim2"/>
    </InputClaims>
    <InputParameters>
      <InputParameter Id="stringComparison" DataType="string" Value="ordinalIgnoreCase"/>
    </InputParameters>
  </ClaimsTransformation>

  <ClaimsTransformation Id="DoesUserExist" TransformationMethod="AssertBooleanClaimIsEqualToValue">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="userExists" TransformationClaimType="inputClaim"/>
    </InputClaims>
    <InputParameters>
      <InputParameter Id="valueToCompareTo" DataType="boolean" Value="false"/>
    </InputParameters>
  </ClaimsTransformation>

DoEmailsMatch和DoPasswordsMatch非常简单,使用AssertStringClaimsAreEqual内置断言来显示在调用索赔提供程序技术配置文件的元数据中定义的消息:

<Item Key="UserMessageIfClaimsTransformationStringsAreNotEqual">Email and confirm email, or password and confirm password do not match.</Item>
电子邮件和确认电子邮件,或密码和确认密码不匹配。
DoesUserExist依赖于AssertBooleanClaimiSequalValue,这意味着它需要一个布尔值来决定是否显示元数据中定义的其他消息:

<Item Key="UserMessageIfClaimsTransformationBooleanValueIsNotEqual">This email address is already in use, please sign in.</Item>
此电子邮件地址已被使用,请登录。

设置该布尔值的代码可能超出了这个问题的范围,但简而言之,它是通过读取AAD数据库来设置的,该数据库在声明中返回匹配的用户主体名称,或者根本没有声明。这将使用DoesClaimExist进行声明转换,以设置上面DoesUserExist使用的布尔userExists声明。

对于第三个声明,改为执行AAD读取操作,并且它有一个内置的错误消息,用于指示何时存在使用

您可以在AAD B2C入门包中找到默认注册流程所使用的

对于密码匹配,使用密码并重新输入密码,使用内置方式


现在,您只需将1索赔转换用于电子邮件匹配。

Hi@Jas Suri,谢谢!关于使用内置密码验证而不是手动验证的提示,提供了我所需要的。我将密码重入字段命名为“confirmPassword”而不是“reenterPassword”,没有意识到reenterPassword背后隐藏了神奇的逻辑。我确实想到了一件事,但这对我来说不再是问题:如果主体已经存在,我不确定AADEARD操作是否会引发错误。我只能从AADWrite获得RaiseErrorIfClaimsPrincipalAlreadyExists。是的,你在read op评论中说得对,需要使用声明转换。我只是想确认一下。不管怎样,我的问题现在解决了,再次感谢。