带确认屏幕的Azure AD B2C重置密码自定义策略

时间:2018-11-21 06:26:41

标签: azure-active-directory azure-ad-b2c identity-experience-framework

我已经在Azure AD B2C中设置了登录自定义策略,以便在登录流程中自定义GUI动态内容,并根据某些情况自定义品牌。此登录策略显示“忘记密码了?”由我的应用程序处理的链接,以启动另一个自定义密码重设策略的流程。

在B2C提供的标准密码重置策略中,一旦用户重置了密码,就会出现一个附加屏幕,指示密码已成功更改,并提供了重新执行登录策略的链接。使用自定义策略时,重置密码后将立即调用重定向URL。

是否可以通过显示确认消息的屏幕在密码重置策略流程中配置其他步骤?

1 个答案:

答案 0 :(得分:2)

我也一直在为此苦苦挣扎。通过将以下内容添加到扩展文件中,我设法使其正常工作。

  1. 步骤3 添加到 PasswordReset UserJourney
  2. 的现有业务流程步骤中
<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>
    <OrchestrationStep Order="3" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="ShowSuccess" TechnicalProfileReferenceId="LocalAccountWritePasswordChanged" />
      </ClaimsExchanges>
    </OrchestrationStep>
    <OrchestrationStep Order="4" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
  </OrchestrationSteps>
  <ClientDefinition ReferenceId="DefaultWeb" />
</UserJourney>

  1. 在BuildingBlocks / ClaimsSchema中添加此ClaimType
  <ClaimType Id="justResetPassword">
    <DisplayName>justResetPassword</DisplayName>
    <DataType>boolean</DataType>
    <UserHelpText>Indicates whether the user just reset their password via the forgot password feature.</UserHelpText>
    <UserInputType>Button</UserInputType>
  </ClaimType>

  1. 添加上述新的技术资料: LocalAccountWritePasswordChanged
    <TechnicalProfile Id="LocalAccountWritePasswordChanged">
      <DisplayName>Changed password</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <Metadata>
        <Item Key="ContentDefinitionReferenceId">api.passwordchangesuccess</Item>
        <Item Key="language.button_continue">Back to Login</Item>
        <Item Key="language.initial_intro">Ready to login again...</Item>
        <Item Key="language.verifying_blurb">Preparing login screen.</Item>
        <!-- TODO: Hide cancel button -->
      </Metadata>
      <CryptographicKeys>
        <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
      </CryptographicKeys>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="objectId" />
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="justResetPassword" DefaultValue="true" />
      </OutputClaims>
    </TechnicalProfile>

  1. 修改您的依赖方文件,使其也具有新类型 justResetPassword
  2. 的outputClaim
<OutputClaim ClaimTypeReferenceId="justResetPassword" />

我认为诀窍在于,此新技术资料的输出声明为justResetPassword,因此它将尝试尝试捕获该值。因为它的数据类型是按钮,但它不会显示。这一点我不太清楚,但是由于它正在起作用,花了我很长时间才到达这里,所以我不会对此提出太多质疑。

您可能会注意到,此新技术资料引用了api.passwordchangesuccess的ContentDefinition。这是我创建的自定义内容定义,旨在为“密码重置消息”提供更好的自定义标题。如果您不需要对成功页面进行太多自定义,则可以使用ContentDefinition api.selfasserted

重置密码后的最终结果: Screenshot