Xml 如何使用自定义策略检查用户是否存在于广告B2C中?

Xml 如何使用自定义策略检查用户是否存在于广告B2C中?,xml,azure-ad-b2c,identity-experience-framework,Xml,Azure Ad B2c,Identity Experience Framework,我有一个注册流程,它运行良好,是多步骤的: 联系方式 核实 密码 现在的流程是,在完成所有步骤后,将创建一个新用户,如果用户名已经存在,那么在最后一步中,我将收到一条错误消息,该用户已经存在。现在我需要改变这个流程。输入联系人详细信息(电子邮件)后,我想检查该用户是否存在。如果它存在,那么我需要在第一步的最后一步中显示错误消息,并阻止移动到下一步 为了实现这一目标,我所做的是: 创建一个TP,使用电子邮件读取用户详细信息,并将其作为第一步的验证技术配置文件: <TechnicalProfi

我有一个注册流程,它运行良好,是多步骤的:

  • 联系方式
  • 核实
  • 密码
  • 现在的流程是,在完成所有步骤后,将创建一个新用户,如果用户名已经存在,那么在最后一步中,我将收到一条错误消息,该用户已经存在。现在我需要改变这个流程。输入联系人详细信息(电子邮件)后,我想检查该用户是否存在。如果它存在,那么我需要在第一步的最后一步中显示错误消息,并阻止移动到下一步

    为了实现这一目标,我所做的是:

    创建一个TP,使用电子邮件读取用户详细信息,并将其作为第一步的验证技术配置文件:

    <TechnicalProfile Id="AAD-CheckUserExist">
                        <Metadata>
                            <Item Key="Operation">Read</Item>                        
                            <Item Key="RaiseErrorIfClaimsPrincipalAlreadyExists">true</Item>
                        </Metadata>
                        <IncludeInSso>false</IncludeInSso>
                        <InputClaims>                       
                            <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="signInNames.emailAddress" />                        
                        </InputClaims>
                        <OutputClaims>
                            <!-- Required claims -->
                            <OutputClaim ClaimTypeReferenceId="objectId" />
                            <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="localAccountAuthentication" />
                            <!-- Optional claims -->
                            <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
                            <OutputClaim ClaimTypeReferenceId="displayName" />
                            <OutputClaim ClaimTypeReferenceId="accountEnabled" />
                            <OutputClaim ClaimTypeReferenceId="otherMails" />
                            <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress"/>
                            <OutputClaim ClaimTypeReferenceId="signInNames.phoneNumber"/>
                            <OutputClaim ClaimTypeReferenceId="givenName" />
                            <OutputClaim ClaimTypeReferenceId="surname" />
                        </OutputClaims>
                        <IncludeTechnicalProfile ReferenceId="AAD-Common" />
                    </TechnicalProfile>
    
    
    阅读
    真的
    假的
    
    并将
    true
    添加到

    以下是验证配置文件部分:

    
    

    但它并没有像预期的那样工作,我在第一步单击“下一步”后尝试了现有用户,它移动验证步骤时没有任何错误。

    只有当操作是写入时,RaiseErrorIfClaimsPrincipalAlreadyExists才有效

    读取操作后,仅当用户已存在时,才会填充objectId声明。您必须使用RaiseErrorIfClaimsPrincipalDoesNotExist=false阅读,然后您可以使用ClaimTransformations和ValidationTechnicalProfiles来阻止用户旅程,如果objectId!=空的

    编辑: 范例

    我在AAD索赔提供商下创建了AAD UserReadUsingEmailAddress RaiseiExists技术配置文件

        <TechnicalProfile Id="AAD-UserReadUsingEmailAddress-RaiseIfExists">
          <Metadata>
            <Item Key="Operation">Read</Item>
            <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">false</Item>
          </Metadata>
          <IncludeInSso>false</IncludeInSso>
          <InputClaims>
            <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="signInNames.emailAddress" Required="true" />
          </InputClaims>
          <OutputClaims>
            <!-- Required claims -->
            <OutputClaim ClaimTypeReferenceId="objectId" DefaultValue="NOTFOUND" />
            <OutputClaim ClaimTypeReferenceId="objectIdNotFound" DefaultValue="NOTFOUND" AlwaysUseDefaultValue="true" />
          </OutputClaims>
          <OutputClaimsTransformations>
            <OutputClaimsTransformation ReferenceId="AssertObjectIdObjectIdNotFoundAreEqual" />
          </OutputClaimsTransformations>
          <IncludeTechnicalProfile ReferenceId="AAD-Common" />
        </TechnicalProfile>
    
    
    阅读
    假的
    假的
    
    如您所见,我使用电子邮件声明来搜索用户,只返回objectId。请注意RaiseErrorIfClaimsPrincipalDoesNotExist=false以及objectId的默认值NOTFOUND。根据AlwaysSuseDefaultValue=“true”,将始终找不到ObjectedNotFound

    ObjectDNotFound是一个简单的字符串声明

      <ClaimType Id="objectIdNotFound">
        <DisplayName>Used for comparison</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
    
    
    用于比较
    一串
    
    AssertObjectObjectdNotFoundarequal OutputClaim转换信息如下:

       <ClaimsTransformation Id="AssertObjectIdObjectIdNotFoundAreEqual" TransformationMethod="AssertStringClaimsAreEqual">
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="objectId" TransformationClaimType="inputClaim1" />
          <InputClaim ClaimTypeReferenceId="objectIdNotFound" TransformationClaimType="inputClaim2" />
        </InputClaims>
        <InputParameters>
          <InputParameter Id="stringComparison" DataType="string" Value="ordinalIgnoreCase" />
        </InputParameters>
      </ClaimsTransformation>
    
    
    
    然后,我使用AAD UserReadUsingEmailAddress RaiseIfExists作为自断言技术文件中的验证技术文件

        <TechnicalProfile Id="LocalAccountSignUpWithLogonEmail-CheckEmailAlreadyExists">
          <DisplayName>Email signup</DisplayName>
          <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          <Metadata>
            <Item Key="IpAddressClaimReferenceId">IpAddress</Item>
            <Item Key="ContentDefinitionReferenceId">api.localaccountsignup</Item>
            <Item Key="language.button_continue">Next</Item>
            <Item Key="UserMessageIfClaimsTransformationStringsAreNotEqual">There is another user with this email address</Item>
          </Metadata>
          <InputClaims>
            <InputClaim ClaimTypeReferenceId="email" />
          </InputClaims>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
          </OutputClaims>
          <ValidationTechnicalProfiles>
            <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress-RaiseIfExists" />
          </ValidationTechnicalProfiles>
        </TechnicalProfile>
    
    
    电子邮件注册
    IP地址
    api.localaccountsignup
    下一个
    有另一个用户使用此电子邮件地址
    
    使用此设置,当您单击“继续”时,将执行验证技术配置文件,如果已经有用户使用插入的电子邮件,则会引发错误。发生这种情况的原因是,如果找到了用户,objectId将是一个guid,它将不等于“NOTFOUND”。 您可以通过UserMessageIfClaimsTransformationStringsAreNotEqual元数据更改错误消息


    HTH,F.

    我也有同样的问题。RaiseErrorIfClaimsPrincipalAlreadyExists可能仅与写入操作一起工作。我正在对此进行一些试验,如果我发现任何东西,我肯定会让你知道我们可以检查objectId是否存在,但是如何阻止移动到下一步?这很有效,谢谢。我没有考虑过这个“UserMessageIfclaimsFormationsTringsArenoteQual”,谢谢。仅供参考,我编辑了一点答案,删除了不必要的OutputClaimTransformation,并重新命名了一些内容。逻辑是一样的。非常感谢你的帮助。但我得到了一个错误消息-使用StringComparison“OrdinalingOreCase”进行索赔值比较失败。