Как проверить, существует ли пользователь в AD B2 C, используя пользовательскую политику? - PullRequest
2 голосов
/ 22 января 2020

У меня есть поток регистрации, и он работает нормально, и он многоступенчатый:

  1. Контактная информация
  2. Проверка
  3. Пароль

И теперь процесс, после выполнения всех шагов, будет создан новый пользователь, если имя пользователя уже существует, то на последнем шаге я получаю сообщение об ошибке, что пользователь уже существует. Теперь мне нужно изменить этот поток. После ввода контактных данных (адрес электронной почты) я хочу проверить, существует ли этот пользователь или нет. Если оно существует, мне нужно показать сообщение об ошибке, которое отображается на последнем шаге самого первого шага, и заблокировать переход от перехода к следующему шагу.

Для этого я сделал следующее:

Создал 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>

И добавил <Item Key="RaiseErrorIfClaimsPrincipalAlreadyExists">true</Item> в <Metadata>.

Ниже приведен раздел профиля проверки:

 <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="AAD-CheckUserExist" ContinueOnError="false"/>
 </ValidationTechnicalProfiles>

Но он не работает должным образом, я попытался с существующим пользователем после нажатия на следующий в первом step он перемещает шаг проверки без ошибок.

1 Ответ

1 голос
/ 23 января 2020

RaiseErrorIfClaimsPrincipalAlreadyExists работает только при операции Запись .

После операции чтения утверждение objectId заполняется, только если пользователь уже существует. Вам необходимо прочитать с помощью RaiseErrorIfClaimsPrincipalDoesNotExist = false , а затем вы можете поиграть с ClaimTransformations и ValidationTechnicalProfiles, чтобы заблокировать UserJourney, если objectId! = Null

EDIT: пример

EDIT: пример *

Я создал AAD-UserReadUsingEmailAddress-RaiseIfExists Технический профиль в провайдере утверждений AAD

    <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. objectIdNotFound всегда будет NOTFOUND в соответствии с AlwaysUseDefaultValue = "true"

objectIdNotFound представляет собой простое строковое утверждение

  <ClaimType Id="objectIdNotFound">
    <DisplayName>Used for comparison</DisplayName>
    <DataType>string</DataType>
  </ClaimType>

AssertObjectIdObjectIdNotFoundAreEqual Output29 isAll после получения: *

   <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 в качестве Технического профиля проверки в моем SelfAsserted TechnicalProfile

    <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>

С этой настройкой, когда вы нажимаете «Продолжить», Технический профиль проверки выполняется и выдает ошибку, если уже есть пользователь с вставленным адресом электронной почты. Это происходит потому, что если пользователь найден, objectId будет guid, и он не будет равен "NOTFOUND". Вы можете изменить сообщение об ошибке с помощью метаданных UserMessageIfClaimsTransformationStringsAreNotEqual .

HTH, F.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...