通过 DisplayControl 验证电子邮件

问题描述 投票:0回答:1

我们当前的重置密码流程首先向您显示电子邮件地址字段。然后向您发送一封包含 OTP 代码的电子邮件,以验证您的电子邮件并继续重置密码。我们使用入门包和 SendGrid 来发送电子邮件,并通过 Microsoft 的示例文档实现。

在发送电子邮件之前,我无法获取自定义策略来验证/验证该电子邮件是否确实作为我们的 AAD 中的注册用户(即具有 objectId)存在。

我想要的是:策略检查此电子邮件地址是否已在 AAD 上注册。如果是,则继续发送 OTP 代码来验证电子邮件,帮助用户重置密码。如果不是,请中断流程,不要发送任何电子邮件,也不要返回任何错误消息。 微软有一个可用的演示,但用于登录。

这是我使用的密码重置的 UserJourney:

<UserJourney Id="PasswordReset">
      <OrchestrationSteps>
        <OrchestrationStep Order="1" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="PasswordResetUsingEmailAddressExchange" TechnicalProfileReferenceId="LocalAccountDiscoveryUsingEmailAddress" />
          </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="2" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="NewCredentials" TechnicalProfileReferenceId="LocalAccountWritePasswordUsingObjectId" />
          </ClaimsExchanges>
        </OrchestrationStep>
        <!-- Send security alert email -->
        <OrchestrationStep Order="3" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="Sendalertemail" TechnicalProfileReferenceId="Alertemail" />
          </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="4" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
      </OrchestrationSteps>
      <ClientDefinition ReferenceId="DefaultWeb" />
    </UserJourney> 

第1步中技术简介的内容:

<TechnicalProfile Id="LocalAccountDiscoveryUsingEmailAddress">
  <DisplayName>Reset password using email address</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.localaccountpasswordreset</Item>
  </Metadata>
  <IncludeInSso>false</IncludeInSso>
  <DisplayClaims>
    <DisplayClaim DisplayControlReferenceId="emailVerificationControl" />
  </DisplayClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="email" />
    <OutputClaim ClaimTypeReferenceId="objectId" />
    <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
    <OutputClaim ClaimTypeReferenceId="authenticationSource" />
  </OutputClaims>
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress-emailAddress" />
  </ValidationTechnicalProfiles>
</TechnicalProfile>

以及其中的验证技术简介:

<TechnicalProfile Id="AAD-UserReadUsingEmailAddress-emailAddress">
          <Metadata>
            <Item Key="Operation">Read</Item>
            <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item>
          </Metadata>
          <IncludeInSso>false</IncludeInSso>
          <InputClaims>
            <InputClaim ClaimTypeReferenceId="email" 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>

我尝试了this解决方案,但它根本没有改变我页面的行为。

azure-active-directory azure-ad-b2c azure-ad-b2c-custom-policy
1个回答
0
投票

我设法通过在GenerateOtp之前将其添加到SendCode操作中来解决这个问题:

<ValidationClaimsExchangeTechnicalProfile TechnicalProfileReferenceId="AAD-UserReadUsingEmailAddress-emailAddress" ContinueOnError="false" />

AAD-UserReadUsingEmailAddress-emailAddress 负责根据 AAD 检查 objectId。

然后,SendOtp 中的前提条件:

        <Precondition Type="ClaimsExist" ExecuteActionsIf="false">
          <Value>objectId</Value>
          <Action>SkipThisValidationTechnicalProfile</Action>
        </Precondition>
© www.soinside.com 2019 - 2024. All rights reserved.