DisplayControl - проверка того, что адрес электронной почты не используется - Azure AD B2C

Я получил запрос на подтверждение того, что адрес электронной почты не использовался перед отправкой кода подтверждения в нашей настраиваемой политике регистрации. В нашей политике сброса пароля мы используем DisplayControl для проверки наличия пароля перед отправкой кода OTP и отправляем OTP только в том случае, если электронное письмо уже было зарегистрировано. Однако мне нужно сделать обратное для процесса регистрации, отправлять код только в том случае, если электронное письмо НЕ было зарегистрировано.

Я пробовал использовать следующее:

      <DisplayControl Id="emailVerificationControlSignUp" UserInterfaceControlType="VerificationControl">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="emailAddress" />
    </InputClaims>
    <DisplayClaims>
      <DisplayClaim ClaimTypeReferenceId="emailAddress" ControlClaimType="Email" Required="true" />
      <DisplayClaim ClaimTypeReferenceId="verificationCode" ControlClaimType="VerificationCode" Required="true" />
    </DisplayClaims>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="azureMfaSessionId" />
    </OutputClaims>
    <Actions>
      <!--Before generating and sending an OTP, we first take the users email and lookup the directory for a user. If a user is returned we will have the objectId claim in the claimbag-->
      <Action Id="SendCode">
        <ValidationClaimsExchange>
          <ValidationClaimsExchangeTechnicalProfile TechnicalProfileReferenceId="AAD-UserReadUsingEmailAddress-emailAdressExist" ContinueOnError="true" ContinueOnSuccess="false" />
          <ValidationClaimsExchangeTechnicalProfile TechnicalProfileReferenceId="AadSspr-SendCode">
            <Preconditions>
              <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                <Value>objectId</Value>
                <Action>SkipThisValidationTechnicalProfile</Action>
              </Precondition>
            </Preconditions>
          </ValidationClaimsExchangeTechnicalProfile>
        </ValidationClaimsExchange>
      </Action>
      <Action Id="VerifyCode">
        <ValidationClaimsExchange>
          <ValidationClaimsExchangeTechnicalProfile TechnicalProfileReferenceId="AadSspr-VerifyCode" />
        </ValidationClaimsExchange>
      </Action>
    </Actions>
  </DisplayControl>

и этот технический профиль

<TechnicalProfile Id="AAD-UserReadUsingEmailAddress-emailAdressExist">
      <Metadata>
        <Item Key="Operation">Read</Item>
        <Item Key="RaiseErrorIfClaimsPrincipalAlreadyExists">true</Item>
        <!--<Item Key="UserMessageIfClaimsPrincipalDoesNotExist">UserMessageIfClaimsPrincipalDoesNotExist</Item>
        <Item Key="UserMessageIfClaimsPrincipalAlreadyExists">UserMessageIfClaimsPrincipalAlreadyExists</Item>-->
      </Metadata>
      <IncludeInSso>false</IncludeInSso>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="emailAddress" PartnerClaimType="signInNames.emailAddress" Required="true" />
      </InputClaims>
      <OutputClaims>
        <!-- Required claims -->
        <OutputClaim ClaimTypeReferenceId="objectId" />
        <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="localAccountAuthentication" />
        <!-- Optional claims -->
        <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
        <OutputClaim ClaimTypeReferenceId="displayName" />
        <OutputClaim ClaimTypeReferenceId="otherMails" />
        <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" />
      </OutputClaims>
      <IncludeTechnicalProfile ReferenceId="AAD-Common" />
    </TechnicalProfile>

Что происходит, так это то, что OTP действительно отправляется только в том случае, если электронное письмо не было зарегистрировано, однако DisplayControl всегда изменяется, чтобы отображать кнопки проверки кода / отправки нового кода, даже если электронное письмо было зарегистрировано. Итак, в конце концов, что происходит, если электронная почта была зарегистрирована, пользователь не получает OTP, только если электронная почта НЕ была зарегистрирована. Однако ничто на экране не сообщает об этом пользователю.

введите описание изображения здесь Адрес электронной почты был зарегистрирован, пользователь должен увидеть сообщение об ошибке, а не кнопки подтверждения / отправки нового кода

Как я могу исправить этот DisplayControl?

Спасибо


person Henrique Belotto    schedule 12.02.2021    source источник


Ответы (1)


спасибо, что обратились к нам. Из приведенного выше элемента DisplayControl я вижу, что пользователь уже готовится из этой строки:

<ValidationClaimsExchangeTechnicalProfile TechnicalProfileReferenceId="AAD-UserReadUsingEmailAddress-emailAdressExist" ContinueOnError="true" ContinueOnSuccess="false" />

После того, как пользователь прочитает, проверьте, существует ли объект objectid - ›вызовите ClaimTransform

  • ClaimTransform для сравнения объектного утверждения с некоторым фиктивным значением
  • Будет выдано логическое значение (истина) или ошибка
  • Поскольку это вызывается только тогда, когда существует objectId, он всегда будет выдавать ошибку https://docs.microsoft.com/en-us/azure/active-directory-b2c/string-transformations#assertstringclaimsareequal
  • Продолжить отправку кода, если objectid не существует AadSspr-SendCode

Примечание. Этот подход не рекомендуется, поскольку его можно использовать для сбора электронных писем. Рекомендуемый подход - отправка электронной почты во всех случаях для регистрации.

person SouravMishra-MSFT    schedule 16.02.2021
comment
Привет! Я пробовал этот подход, но как бы я ни пытался его изменить, у меня все равно возникает такая же или похожая проблема. Не могли бы вы объяснить, как это реализовать? Я читал документацию на сайте MS, но это не очень помогло. - person Henrique Belotto; 18.02.2021