在 Azure Active Directory B2C 中使用自定义策略设置密码更改

开始之前,请使用此页顶部的“选择策略类型”选择器来选择要设置的策略类型。 Azure Active Directory B2C 提供了两种定义用户如何与应用程序交互的方法:通过预定义的用户流,或者通过可完全配置的自定义策略。 对于每种方法,本文中所需的步骤都不同。

密码更改流程涉及以下步骤:

  1. 用户登录到其本地帐户。 如果会话仍处于活动状态,Azure AD B2C 会向用户授权,并跳到下一步。

  2. 在“旧密码”中,用户验证旧密码。 在“新密码”中,创建并确认新密码。

    Screenshot that shows two numbered dialogs for making a password change.

提示

用户只有在知道密码并且想要更改其密码时,才能使用本文中所述的密码更改流程。

此功能仅适用于自定义策略。 对于设置步骤,请在前面的选择器中选择“自定义策略”。

先决条件

添加元素

  1. 打开 TrustFrameworkExtensions.xml 文件。 向 ClaimsSchema 元素添加标识符为 oldPassword 的以下 ClaimType 元素:

    <BuildingBlocks>
      <ClaimsSchema>
        <ClaimType Id="oldPassword">
          <DisplayName>Old Password</DisplayName>
          <DataType>string</DataType>
          <UserHelpText>Enter your old password</UserHelpText>
          <UserInputType>Password</UserInputType>
        </ClaimType>
      </ClaimsSchema>
    </BuildingBlocks>
    
  2. ClaimsProvider 元素包含对用户进行身份验证的技术配置文件。 将以下声明提供程序添加到 ClaimsProviders 元素:

    <ClaimsProviders>
      <ClaimsProvider>
        <DisplayName>Local Account SignIn</DisplayName>
        <TechnicalProfiles>
          <TechnicalProfile Id="login-NonInteractive-PasswordChange">
            <DisplayName>Local Account SignIn</DisplayName>
            <InputClaims>
              <InputClaim ClaimTypeReferenceId="oldPassword" PartnerClaimType="password" Required="true" />
              </InputClaims>
            <IncludeTechnicalProfile ReferenceId="login-NonInteractive" />
          </TechnicalProfile>
        </TechnicalProfiles>
      </ClaimsProvider>
      <ClaimsProvider>
        <DisplayName>Local Account Password Change</DisplayName>
        <TechnicalProfiles>
          <TechnicalProfile Id="LocalAccountWritePasswordChangeUsingObjectId">
            <DisplayName>Change password (username)</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.selfasserted</Item>
            </Metadata>
            <InputClaims>
              <InputClaim ClaimTypeReferenceId="objectId" />
            </InputClaims>
            <OutputClaims>
              <OutputClaim ClaimTypeReferenceId="oldPassword" Required="true" />
              <OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
              <OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
            </OutputClaims>
            <ValidationTechnicalProfiles>
              <ValidationTechnicalProfile ReferenceId="login-NonInteractive-PasswordChange" />
              <ValidationTechnicalProfile ReferenceId="AAD-UserWritePasswordUsingObjectId" />
            </ValidationTechnicalProfiles>
          </TechnicalProfile>
        </TechnicalProfiles>
      </ClaimsProvider>
    </ClaimsProviders>
    
  3. UserJourney 元素定义用户与应用程序进行交互时使用的路径。 如果不存在 UserJourneys 元素,则添加一个标识符为 PasswordChange 的 UserJourney:

    <UserJourneys>
      <UserJourney Id="PasswordChange">
        <OrchestrationSteps>
          <OrchestrationStep Order="1" Type="ClaimsProviderSelection" ContentDefinitionReferenceId="api.signuporsignin">
            <ClaimsProviderSelections>
              <ClaimsProviderSelection TargetClaimsExchangeId="LocalAccountSigninEmailExchange" />
            </ClaimsProviderSelections>
          </OrchestrationStep>
          <OrchestrationStep Order="2" Type="ClaimsExchange">
            <ClaimsExchanges>
              <ClaimsExchange Id="LocalAccountSigninEmailExchange" TechnicalProfileReferenceId="SelfAsserted-LocalAccountSignin-Email" />
            </ClaimsExchanges>
          </OrchestrationStep>
          <OrchestrationStep Order="3" Type="ClaimsExchange">
            <ClaimsExchanges>
              <ClaimsExchange Id="NewCredentials" TechnicalProfileReferenceId="LocalAccountWritePasswordChangeUsingObjectId" />
            </ClaimsExchanges>
          </OrchestrationStep>
          <OrchestrationStep Order="4" Type="ClaimsExchange">
            <ClaimsExchanges>
              <ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
            </ClaimsExchanges>
          </OrchestrationStep>
          <OrchestrationStep Order="5" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
        </OrchestrationSteps>
        <ClientDefinition ReferenceId="DefaultWeb" />
      </UserJourney>
    </UserJourneys>
    
  4. 保存 TrustFrameworkExtensions.xml 策略文件。

  5. 复制随初学者包下载的 ProfileEdit.xml 文件,并将其命名为 ProfileEditPasswordChange.xml

  6. 打开新文件,并使用唯一值更新 PolicyId 属性。 此值是策略的名称。 例如,B2C_1A_profile_edit_password_change

  7. 修改 DefaultUserJourney 中的 ReferenceId 属性,使其与创建的新用户旅程的 ID 匹配。 例如,PasswordChange

  8. 保存所做更改。

上传并测试策略

  1. 登录 Azure 门户
  2. 如果有权访问多个租户,请选择顶部菜单中的“设置”图标,切换到“目录 + 订阅”菜单中的 Azure AD B2C 租户。
  3. 选择 Azure 门户左上角的“所有服务”,然后搜索并选择“Azure AD B2C” 。
  4. 选择“标识体验框架”。
  5. 在“自定义策略”中,选择“上传策略”。
  6. 选择“覆盖策略(若存在)”,然后搜索并选择 TrustFrameworkExtensions.xml 文件。
  7. 选择“上传”。
  8. 针对信赖方文件(例如 ProfileEditPasswordChange.xml)重复步骤 5 到 7。

运行策略

  1. 打开你更改的策略。 例如,B2C_1A_profile_edit_password_change
  2. 对于“应用程序”,选择在前面注册的应用程序。 若要查看令牌,“回复 URL”应当显示 https://jwt.ms
  3. 选择“立即运行”。 在打开的新选项卡中,从 URL 中删除“&prompt=login”并刷新该选项卡,然后用之前创建的帐户登录。 密码更改对话框将提供更改密码的选项。

后续步骤