Я получил запрос на подтверждение того, что адрес электронной почты не использовался перед отправкой кода подтверждения в нашей настраиваемой политике регистрации. В нашей политике сброса пароля мы используем 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?
Спасибо