【发布时间】:2021-02-12 22:26:02
【问题描述】:
在我们的注册自定义政策中发送验证码之前,我收到了一个验证电子邮件是否未被使用的请求。 在我们的密码重置政策中,我们使用 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?
谢谢
【问题讨论】:
标签: azure-active-directory azure-ad-b2c azure-ad-b2c-custom-policy