如何在强制更改密码时制作自定义登录流程重置密码

How to make a Custom Login Flow reset password on Force Password Change

我已经使用入门包创建了自定义登录流程(仅针对我的广告租户进行了更改)。我在 Ad 中创建了一个新用户,并使用该用户在首次登录时强制更改的临时密码。

当用户第一次登录时,会显示 username/password 无效的错误,而不是转到密码重置页面。

我需要对自定义登录流程进行哪些更改才能显示密码重置页面?

在B2C登录流程中,不能使用临时密码新建的用户。对于流程,它不能重定向到用户更改密码页面。

如果可以 create a new user with a random password using the Azure AD Graph API,而不是使用 Azure 门户,那么您可以实施自定义策略来指示新用户重置随机密码。

要实现此功能,您必须 create a custom attribute,例如ForceChangePasswordNextSignIn,将新用户的自定义属性设置为true,然后在登录流程中测试自定义属性,如下所示。

将新用户的自定义属性设置为true:

{
  "accountEnabled": true,
  "creationType": "LocalAccount",
  "displayName": "Alex Wu",
  "passwordProfile": {
    "password": "Test1234",
    "forceChangePasswordNextLogin": false
  },
  "signInNames": [
    {
      "type": "emailAddress",
      "value": "AlexW@example.com"
    }
  ],
  "extension_<b2cExtensionApplicationObjectIdWithoutHyphens>_ForceChangePasswordNextSignIn": true
}

要在登录流程中测试自定义属性:

  1. 声明代表自定义属性的声明类型。
<ClaimType Id="extension_ForceChangePasswordNextSignIn">
  <DisplayName>Force Change Password Next Sign-In</DisplayName>
  <DataType>boolean</DataType>
</ClaimType>
  1. 声明 an AssertBooleanClaimIsEqualToValue claims transformation 以确保自定义属性未设置为 true(即新用户不必重置为随机密码)。
<ClaimsTransformation Id="EnsureForceChangePasswordNextSignInIsFalse" TransformationMethod="AssertBooleanClaimIsEqualToValue">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="extension_ForceChangePasswordNextSignIn" TransformationClaimType="inputClaim" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="valueToCompareTo" DataType="boolean" Value="false" />
  </InputParameters>
</ClaimsTransformation>
  1. AAD-UserReadUsingEmailAddress 技术配置文件的副本调用 EnsureForceChangePasswordNextSignInIsFalse 声明转换以测试自定义属性未设置为true.
<TechnicalProfile Id="AAD-UserReadUsingSignInName-EnsureForceChangePasswordNextSignInIsFalse">
  ...
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="signInNames" Required="true" />
  </InputClaims>
  <OutputClaims>
    ...
    <OutputClaim ClaimTypeReferenceId="extension_ForceChangePasswordNextSignIn" />
  </OutputClaims>
  <OutputClaimsTransformations>
    ...
    <OutputClaimsTransformation ReferenceId="EnsureForceChangePasswordNextSignInIsFalse" />
  </OutputClaimsTransformations>
</TechnicalProfile>
  1. SelfAsserted-LocalAccountSignin-Email 技术配置文件调用 AAD-UserReadUsingSignInName-EnsureForceChangePasswordNextSignInIsFalse 技术配置文件以显示错误消息,如果自定义属性设置为 true(即新用户必须重置为随机密码)。
<TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Email">
  ...
  <Metadata>
    ...
    <Item Key="UserMessageIfClaimsTransformationBooleanValueIsNotEqual">Whoops, you have to change your admin-created password, so please click 'Forgot your password?'.</Item>
  </Metadata>
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingSignInName-EnsureForceChangePasswordNextSignInIsFalse" />
    <ValidationTechnicalProfile ReferenceId="login-NonInteractive" />
  </ValidationTechnicalProfiles>
  ...
</TechnicalProfile>

MS 提供了一个描述如何执行强制密码重置的示例。参见 Here

这仅在您以编程方式创建用户时有效。需要注意的一点是,您应该确保在创建用户时将 passwordProfile.ForceChangePasswordNextLogin 设置为 false。