当前位置: 首页 > 知识库问答 >
问题:

广告B2C-如何在密码重置流中设置自定义电子邮件验证

昝浩阔
2023-03-14

我有一个自定义的电子邮件发送给用户的要求,从广告B2C,当她/他重置密码。

我按照此文档设置自助密码重置流,效果良好:https://docs.microsoft.com/en-us/azure/active-directory-b2c/add-password-reset-policy?pivots=b2c-自定义策略

为了为密码重置提供一封带有品牌的电子邮件,我遵循以下代码,因为看起来唯一的其他选择是使用显示控件,这些控件目前处于公共预览中(因此我无法在生产中使用它们):https://github.com/azure-ad-b2c/samples/tree/master/policies/custom-email-verifcation

自述文件明确指出它也可以用于密码重置,但代码仅提供了登录电子邮件验证的示例。

我尝试在各种TechnicalProfiles中添加verukationCodeOutputClaim,但我无法可视化提供的javascript代码所需的自定义verukationCode文本框。

我在想也许我应该使用一个特定的内容定义,但是我真的很难找到更新自定义策略xml的正确方法。

更新以澄清:在注册示例中,验证代码被添加到LocalAccountSignUpWithLogonEmail中:

<ClaimsProvider>
        <DisplayName>Local Account</DisplayName>
        <TechnicalProfiles>
          <TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
              <DisplayName>Email signup</DisplayName>
              <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
              <Metadata>
                <!-- Demo: Disable the email verification-->
                <Item Key="EnforceEmailVerification">False</Item>
              </Metadata>
              <OutputClaims>
                <OutputClaim ClaimTypeReferenceId="objectId"/>
                <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true"/>
                
                <!--Demo: Add the verification code claim type-->
                <OutputClaim ClaimTypeReferenceId="verificationCode" Required="true"/>

由于我正在进行密码重置(由以下主题协调),我们可以看到它在第一步中引用了LocalAccountDiscoveryUsingEmailAddress:

    <SubJourney Id="PasswordReset" Type="Call">
          <OrchestrationSteps>
            <!--Sample: Validate user's email address. Run this step only when user resets the password-->
            <OrchestrationStep Order="1" Type="ClaimsExchange">
              <ClaimsExchanges>
                <ClaimsExchange Id="PasswordResetUsingEmailAddressExchange" TechnicalProfileReferenceId="LocalAccountDiscoveryUsingEmailAddress" />
              </ClaimsExchanges>
            </OrchestrationStep>
    
            <!--Sample: Collect and persist a new password. Run this step only when user resets the password-->
            <OrchestrationStep Order="2" Type="ClaimsExchange">
              <ClaimsExchanges>
                <ClaimsExchange Id="NewCredentials" TechnicalProfileReferenceId="LocalAccountWritePasswordUsingObjectId" />
              </ClaimsExchanges>
            </OrchestrationStep>
          </OrchestrationSteps>
        </SubJourney>

因此,我将验证代码(verificationCode)添加到本地帐户发现邮件地址(LocalAccountDiscoveryUsingEmailAddress)中:

    <!-- This technical profile forces the user to verify the email address that they provide on the UI. Only after email is verified, the user account is
    read from the directory. -->
    <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>
        <Item Key="UserMessageIfClaimsTransformationBooleanValueIsNotEqual">Your account has been locked. Contact your support person to unlock it, then try again.</Item>
      </Metadata>
      <CryptographicKeys>
        <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
      </CryptographicKeys>
      <IncludeInSso>false</IncludeInSso>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="verificationCode" Required="true"/>
        <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
        <OutputClaim ClaimTypeReferenceId="objectId" />
        <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
        <OutputClaim ClaimTypeReferenceId="authenticationSource" />
      </OutputClaims>
      <ValidationTechnicalProfiles>
        <ValidationTechnicalProfile ReferenceId="REST-EmailVerification"/>
        <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress" />
      </ValidationTechnicalProfiles>
    </TechnicalProfile>

但是相关的TextBox没有在页面中呈现。

更新2:我发现了为什么输入框没有呈现。它与使用的Content定义有关。通过使用api.selfasserted.profileupdate内容定义,尽管有api.localaccountpasswordreset,该字段被显示出来。现在我还在努力。

更新3:我能够使用api使其工作。自我断言。profileupdate内容定义。我将在完成与验证API的集成后发布完整的解决方案。

共有2个答案

陆子石
2023-03-14

解决方案是使用api。自我断言。profileupdate(而不是api.localaccountpasswordreset)用于技术配置文件的LocalAccountDiscoveryUsingEmailAddress的内容定义。

        <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.selfasserted.profileupdate</Item>
            <Item Key="UserMessageIfClaimsTransformationBooleanValueIsNotEqual">Your account has been locked. Contact your support person to unlock it, then try again.</Item>
            <Item Key="EnforceEmailVerification">false</Item>
          </Metadata>
          <CryptographicKeys>
            <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
          </CryptographicKeys>
          <IncludeInSso>false</IncludeInSso>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
            <OutputClaim ClaimTypeReferenceId="verificationCode" Required="true" />
            <OutputClaim ClaimTypeReferenceId="objectId" />
            <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
            <OutputClaim ClaimTypeReferenceId="authenticationSource" />
          </OutputClaims>
          <ValidationTechnicalProfiles>
            <ValidationTechnicalProfile ReferenceId="REST-EmailVerification" />
            <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress" />
          </ValidationTechnicalProfiles>
        </TechnicalProfile>

它看起来主要是一种变通方法,但它是唯一不使用显示控件预览功能的选项。

为了进一步保护验证,REST EmailVerification验证技术配置文件中有一个API端检查,它重新检查以前验证的客户端代码:

          <ValidationTechnicalProfiles>
            <ValidationTechnicalProfile ReferenceId="REST-EmailVerification" />
            <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress" />
          </ValidationTechnicalProfiles>

此外,我目前正在添加验证码,以避免滥用发送逻辑。

一旦显示控件普遍可用,我将建议我的客户使用它们。

章岳
2023-03-14

交换verified.email输出声明与密码重置技术配置文件中对您的displayControl的引用,即LocalAcCountDiscoveryUsingEmail Address。https://docs.microsoft.com/en-us/azure/active-directory-b2c/custom-email-sendgrid#make-a-reference-to-the-displaycontrol

其基本上是完全相同的步骤,除了您对LocalAccountDiscoveryUsingEmailAddress技术配置文件进行“引用”更改,以在此特定页面上显示显示控件,这在密码重置旅程的步骤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>
            <Item Key="UserMessageIfClaimsTransformationBooleanValueIsNotEqual">Your account has been locked. Contact your support person to unlock it, then try again.</Item>
          </Metadata>
          <CryptographicKeys>
            <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
          </CryptographicKeys>
          <IncludeInSso>false</IncludeInSso>
          <DisplayClaims>
            <DisplayClaim DisplayControlReferenceId="emailVerificationControl" />
          </DisplayClaims>
          <OutputClaims>
            <!--<OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />-->
            <OutputClaim ClaimTypeReferenceId="email" />
            <OutputClaim ClaimTypeReferenceId="objectId" />
            <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
            <OutputClaim ClaimTypeReferenceId="authenticationSource" />

如果你想要一个不同的电子邮件模板来重置密码而不是注册,那么重新创建一个新的displayControl并引用一个不同的模板。

 类似资料:
  • 我使用laravel 5.6,并成功地将视图作为电子邮件发送。 我使用以下代码: 我唯一的问题是密码重置。我知道我可以自定义一点模板,但是如何覆盖默认的电子邮件模板并发送我自己的视图? 我尝试写我自己的ResetPassword通知: 但我只能翻译电子邮件。我想要的是根据我自己的模板发送我自己的视图。 可能吗? 谢谢你的帮助。

  • 问题内容: MyDjango应用程序当前已设置为使用本机注册包来处理用户身份验证和管理。 我创建了一些文件,用于发送密码重置令牌. 它工作正常。除了密码重设电子邮件外,它是一个丑陋的纯文字怪物。我想使其与My应用程序发送的所有其他电子邮件的外观和风格相匹配。IE:我希望它是HTML,并包含图像,样式和链接。我怎么做? 我按照这里的详细说明进行操作。但是,该代码中有一个错误,我不知道该如何处理: 有

  • 我们正在评估KeyCloak以取代我们的用户注册和身份验证的自定义实现。 我们当前的工作流提供了一个注册屏幕,用户可以在其中自行注册。在提交注册表单时,自定义验证流被触发,随后向用户发送电子邮件以验证他们的电子邮件并激活他们的帐户。电子邮件中的链接允许他们设置密码,然后向他们发送欢迎电子邮件。 null

  • 每当我在Firebase中使用电子邮件/密码身份验证提供程序时,提供程序都会在成功注册时发送一个无记名令牌,即使是。是否有一种开箱即用的方法将电子邮件/密码身份验证提供程序配置为在用户验证其电子邮件地址之前不发送无记名令牌(并返回403错误)? 请注意,我知道如何创建用户、登录用户、发送验证电子邮件等。。。使用firebase v9。x通过firebase/auth中的方法创建用户(使用Email

  • 我是拉拉维尔的初学者。目前我正在学习这个框架。我现在的Laravel版本是5.3。 我正在使用