你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Active Directory B2C 中设置密码重置流

重要

自 2025 年 5 月 1 日起,Azure AD B2C 将不再可供新客户购买。 在我们的常见问题解答中了解详细信息

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

注册和登录旅程中,用户可以使用 “忘记密码” 链接重置自己的密码。 此自助密码重置流适用于使用 电子邮件地址用户名 进行登录的 Azure Active Directory B2C(Azure AD B2C)中的本地帐户。

小窍门

如果用户忘记了密码并想要重置密码,则可以使用自助密码重置流来更改其密码。 还可以选择以下用户流选项之一来更改用户的密码:

  • 如果用户知道其密码并想要更改密码,请使用 密码更改流
  • 如果想要强制用户重置其密码(例如,当用户首次登录时、管理员重置其密码或迁移到具有随机密码的 Azure AD B2C 后),请使用 强制密码重置 流。

密码重置流涉及以下步骤:

  1. 在注册和登录页上,用户选择“ 忘记密码?” 链接。 Azure AD B2C 启动密码重置流。
  2. 在下一个出现的对话框中,用户输入其电子邮件地址,然后选择 “发送验证码”。 Azure AD B2C 将验证码发送到用户的电子邮件帐户。 用户从电子邮件复制验证码,在 Azure AD B2C 密码重置对话框中输入代码,然后选择 “验证代码”。
  3. 然后,用户可以输入新密码。 (验证电子邮件后,用户仍然可以选择 “更改电子邮件 ”按钮;如果要删除 更改电子邮件按钮,请参阅“隐藏更改电子邮件”按钮

展示密码重置流程中三个对话框的图示。

selfAsserted.html“更改电子邮件”按钮的默认名称为 changeclaims。 若要查找按钮名称,在注册页上,使用浏览器工具(如 “检查”)检查页面源。

先决条件

  • B2C 用户需要指定一种身份验证方法来进行自助密码重置。 选择 B2C 用户,在“ 管理”下的左侧菜单中,选择 “身份验证方法”。 确保已设置 身份验证联系人信息 。 默认情况下,通过注册流创建的 B2C 用户具有此设置。 对于通过 Azure 门户或图形 API 创建的用户,需要设置 SSPR 的 身份验证联系信息 才能正常工作。

新的密码重置体验现在是注册或登录策略的一部分。 当用户选择 “忘记密码” 链接时,会立即发送到“忘记密码”体验。 应用程序不再需要处理 AADB2C90118错误代码,也不需要单独的密码重置策略。

可以为登录(建议)或注册和登录(推荐)用户流程配置自助密码重置功能。 如果没有其中一个用户流设置,请创建 注册或登录 用户流。

若要为注册或登录用户流程设置自助密码重置,请执行以下步骤:

  1. 登录到 Azure 门户
  2. 如果有权访问多个租户,请选择顶部菜单中的“设置”图标,从“目录 + 订阅”菜单切换到你的 Azure AD B2C 租户。
  3. 在 Azure 门户中,搜索并选择 Azure AD B2C
  4. 选择“用户流”。
  5. 选择要自定义的注册或登录用户流(类型 为推荐)。
  6. “设置”下的菜单中,选择“ 属性”。
  7. “密码配置”下,选择 “自助密码重置”。
  8. 选择“保存”
  9. 在“ 自定义”下的左侧菜单中,选择 “页面布局”。
  10. 页面布局版本中,选择 2.1.3 或更高版本。
  11. 选择“保存”

以下部分介绍如何将自助服务密码体验添加到自定义策略。 此示例基于 自定义策略初学者包中包含的策略文件。

小窍门

可以在 GitHub 上找到注册和登录密码重置策略的完整示例。

若要向策略指示用户选择了 “忘记密码?” 链接,请定义布尔声明。 使用此声明将用户旅程定向到“忘记密码”技术配置文件。 也可以向令牌发出此声明,使应用程序检测到用户是使用“忘记密码”用户流登录的。

声明架构中声明您的主张。 打开策略的扩展文件,例如在SocialAndLocalAccounts/TrustFrameworkExtensions.xml中。

  1. 搜索 BuildingBlocks 元素。 如果该元素不存在,请添加该元素。

  2. 找到 ClaimsSchema 元素。 如果该元素不存在,请添加该元素。

  3. 将以下声明添加到 ClaimsSchema 元素。

    <!-- 
    <BuildingBlocks>
      <ClaimsSchema> -->
        <ClaimType Id="isForgotPassword">
          <DisplayName>isForgotPassword</DisplayName>
          <DataType>boolean</DataType>
          <AdminHelpText>Whether the user has selected Forgot your Password</AdminHelpText>
        </ClaimType>
      <!--
      </ClaimsSchema>
    </BuildingBlocks> -->
    

升级页面布局版本

需要页面布局版本 2.1.2 才能在注册或登录旅程中启用自助密码重置流。 升级页面布局版本:

  1. 打开策略的基本文件,例如 SocialAndLocalAccounts/TrustFrameworkBase.xml

  2. 搜索 BuildingBlocks 元素。 如果该元素不存在,请添加该元素。

  3. 找到 ContentDefinitions 元素。 如果该元素不存在,请添加该元素。

  4. 修改 ContentDefinition 元素中的 DataURI 元素,以具有 IDapi.signuporsignin

    <!-- 
    <BuildingBlocks>
      <ContentDefinitions> -->
        <ContentDefinition Id="api.signuporsignin">
          <DataUri>urn:com:microsoft:aad:b2c:elements:contract:unifiedssp:2.1.2</DataUri>
        </ContentDefinition>
      <!-- 
      </ContentDefinitions>
    </BuildingBlocks> -->
    

添加技术配置文件

声明转换技术配置文件将访问 isForgotPassword 声明。 稍后将引用技术配置文件。 调用时,它将声明的值 isForgotPassword 设置为 true

  1. 打开策略的扩展文件,例如在SocialAndLocalAccounts/TrustFrameworkExtensions.xml中。
  2. 查找 ClaimsProviders 元素(如果该元素不存在,请创建它),然后添加以下声明提供程序:
<!-- 
<ClaimsProviders> -->
  <ClaimsProvider>
    <DisplayName>Local Account</DisplayName>
    <TechnicalProfiles>
      <TechnicalProfile Id="ForgotPassword">
        <DisplayName>Forgot your password?</DisplayName>
        <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="isForgotPassword" DefaultValue="true" AlwaysUseDefaultValue="true"/>
        </OutputClaims>
        <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
      </TechnicalProfile>
      <TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Email">
        <Metadata>
          <Item Key="setting.forgotPasswordLinkOverride">ForgotPasswordExchange</Item>
        </Metadata>
      </TechnicalProfile>
      <TechnicalProfile Id="LocalAccountWritePasswordUsingObjectId">
        <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
      </TechnicalProfile>
    </TechnicalProfiles>
  </ClaimsProvider>
<!-- 
</ClaimsProviders> -->

SelfAsserted-LocalAccountSignin-Email 技术配置文件 setting.forgotPasswordLinkOverride 定义了用户旅程中要执行的密码重置声明交换。

用户需要 LocalAccountWritePasswordUsingObjectId 技术配置文件 UseTechnicalProfileForSessionManagement SM-AAD 会话管理器才能在 SSO 条件下成功执行后续登录。

添加密码重置子历程

用户现在可以在用户旅程中登录、注册和执行密码重置。 为了更好地组织用户旅程,可以使用 子旅程 来处理密码重置流。

子旅程从用户旅程调用,并执行将密码重置体验传递给用户的特定步骤。 使用 Call 类型的子旅程,以便在子旅程完成时,控制权将返回到启动子旅程的编排步骤。

  1. 打开策略的扩展文件,例如 SocialAndLocalAccounts/TrustFrameworkExtensions.xml
  2. 查找 SubJourneys 元素。 如果该元素不存在,请在 User Journeys 元素后面添加它。 然后添加以下子历程:
<!--
<SubJourneys>-->
  <SubJourney Id="PasswordReset" Type="Call">
    <OrchestrationSteps>
      <!-- Validate user's email address. -->
      <OrchestrationStep Order="1" Type="ClaimsExchange">
        <ClaimsExchanges>
          <ClaimsExchange Id="PasswordResetUsingEmailAddressExchange" TechnicalProfileReferenceId="LocalAccountDiscoveryUsingEmailAddress" />
        </ClaimsExchanges>
      </OrchestrationStep>

      <!-- Collect and persist a new password. -->
      <OrchestrationStep Order="2" Type="ClaimsExchange">
        <ClaimsExchanges>
          <ClaimsExchange Id="NewCredentials" TechnicalProfileReferenceId="LocalAccountWritePasswordUsingObjectId" />
        </ClaimsExchanges>
      </OrchestrationStep>
    </OrchestrationSteps>
  </SubJourney>
<!--
</SubJourneys>-->

规划用户体验流程

接下来,若要将“忘记密码”链接到“忘记密码”子流程,需要在CombinedSignInAndSignUp步骤的ClaimsProviderSelection元素中引用“忘记密码”子流程 ID。

如果没有带有 CombinedSignInAndSignUp 步骤的自定义用户旅程,请完成以下步骤复制现有的注册或登录用户旅程。 否则,继续到下一部分。

  1. 在初学者包中,打开 TrustFrameworkBase.xml 文件,如 SocialAndLocalAccounts/TrustFrameworkBase.xml
  2. 找到并复制包含 Id="SignUpOrSignIn" 元素的完整内容。
  3. 打开 TrustFrameworkExtensions.xml 文件(如 SocialAndLocalAccounts/TrustFrameworkExtensions.xml),并查找 UserJourneys 元素。 如果该元素不存在,请创建它。
  4. 通过粘贴在步骤 2 中复制的 UserJourney 元素的全部内容来创建 UserJourneys 元素的子元素。
  5. 重命名用户旅程的 ID。 例如,Id="CustomSignUpSignIn"

在用户旅程中,可以将“忘记密码”子历程表示为 ClaimsProviderSelection。 通过添加此元素,将 “忘记密码” 链接连接到“忘记密码”子旅程。

  1. 打开 TrustFrameworkExtensions.xml 文件,如 SocialAndLocalAccounts/TrustFrameworkExtensions.xml

  2. 在用户旅程中,查找包含 Type="CombinedSignInAndSignUp"Type="ClaimsProviderSelection" 的业务流程步骤元素。 通常这是第一个编排步骤。 ClaimsProviderSelections 元素包含用户可用于登录的标识提供者列表。 添加以下行:

    <ClaimsProviderSelection TargetClaimsExchangeId="ForgotPasswordExchange" />
    
  3. 在下一个业务流程步骤中,通过添加以下行添加 ClaimsExchange 元素:

    <ClaimsExchange Id="ForgotPasswordExchange" TechnicalProfileReferenceId="ForgotPassword" />
    
  4. 在当前步骤和下一步之间添加以下编排步骤。 添加的新业务流程步骤将检查 isForgotPassword 声明是否存在。 如果该声明存在,它将调用密码重置子历程

    <OrchestrationStep Order="3" Type="InvokeSubJourney">
      <Preconditions>
        <Precondition Type="ClaimsExist" ExecuteActionsIf="false">
          <Value>isForgotPassword</Value>
          <Action>SkipThisOrchestrationStep</Action>
        </Precondition>
      </Preconditions>
      <JourneyList>
        <Candidate SubJourneyReferenceId="PasswordReset" />
      </JourneyList>
    </OrchestrationStep>
    
  5. 添加新的流程步骤后,重新编号这些步骤,确保按顺序排列,不遗漏从1到N的任何整数。

设置要执行的用户旅程

现在,你已修改或创建了用户旅程,请在 “信赖方 ”部分中指定 Azure AD B2C 将为此自定义策略执行的旅程。

  1. 打开具有 信赖方 元素的文件,如 SocialAndLocalAccounts/SignUpOrSignin.xml

  2. RelyingParty 元素中,找到 DefaultUserJourney 元素。

  3. 更新 DefaultUserJourney ReferenceId,使其与添加了 ClaimsProviderSelections 的用户旅程的 ID 一致

<RelyingParty>
  <DefaultUserJourney ReferenceId="CustomSignUpSignIn" />
  ...
</RelyingParty>

指示应用的“忘记密码”流

应用程序可能需要使用忘记密码用户流来检测用户是否已登录。 isForgotPassword 声明包含一个布尔值,指示他们确实忘记了密码。 该声明可以在发送给应用程序的令牌中发出。 如有必要,请将 isForgotPassword 添加到 信赖方 部分中的输出声明。 应用程序可以检查 isForgotPassword 声明,以确定用户是否重置其密码。

<RelyingParty>
  <OutputClaims>
    ...
    <OutputClaim ClaimTypeReferenceId="isForgotPassword" DefaultValue="false" />
  </OutputClaims>
</RelyingParty>

上传自定义策略

  1. 登录到 Azure 门户
  2. 如果有权访问多个租户,请选择顶部菜单中的 “设置” 图标,从 “目录 + 订阅 ”菜单切换到 Azure AD B2C 租户。
  3. 在 Azure 门户中,搜索并选择 Azure AD B2C
  4. “策略”下的菜单中,选择“ 标识体验框架”。
  5. 选择“上传自定义策略”。 按以下顺序上传已更改的策略文件:
    1. 策略的基本文件,例如 TrustFrameworkBase.xml
    2. 例如,扩展策略 TrustFrameworkExtensions.xml
    3. 信赖方策略,例如 SignUpSignIn.xml

隐藏更改电子邮件按钮(可选)

验证电子邮件后,用户仍然可以选择“ 更改电子邮件”,输入其他电子邮件地址,然后重复电子邮件验证。 如果想要隐藏 “更改电子邮件 ”按钮,可以修改 CSS 以隐藏对话框中关联的 HTML 元素。 例如,可以添加以下 CSS 条目以 selfAsserted.html 并使用 HTML 模板自定义用户界面

<style type="text/css">
   .changeClaims
   {
     visibility: hidden;
   }
</style>

测试密码重置流

  1. 选择要测试的注册或登录用户流(建议的类型)。
  2. 选择运行用户流
  3. 对于 应用程序,请选择前面注册的名为 webapp1 的 Web 应用程序。 “回复 URL”应显示为 https://jwt.ms
  4. 选择运行用户流
  5. 在注册或登录页上,选择“ 忘记密码?”
  6. 验证之前创建的帐户的电子邮件地址,然后选择“ 继续”。
  7. 在显示的对话框中,更改用户的密码,然后选择“ 继续”。 令牌被返回到 https://jwt.ms ,浏览器会显示它。
  8. 检查返回令牌的 isForgotPassword 声明值。 如果存在并设置为 true,则用户已重置密码。

密码重置策略(旧版)

如果未启用 自助密码重置 体验,则选择此链接不会自动触发密码重置用户流。 而是将错误代码 AADB2C90118 返回给应用程序。 应用程序必须重新初始化身份验证库以验证 Azure AD B2C 密码重置用户流,从而处理此错误代码。

下图描述了该过程:

  1. 在应用程序中,用户选择 “登录”。 应用启动授权请求并重定向到 Azure AD B2C,以便用户完成登录。 授权请求指定注册或登录策略名称,例如 B2C_1_signup_signin
  2. 用户选择“ 忘记密码?” 链接。 Azure AD B2C 将 AADB2C90118 错误代码返回到应用程序。
  3. 应用程序处理错误代码并启动新的授权请求。 授权请求指定密码重置策略名称,例如 B2C_1_pwd_reset

此图显示了带编号步骤的旧密码重置用户流。

可查看 ASP.NET 示例中用户流链接方式的基本演示。

创建密码重置用户流

若要让应用程序用户重置其密码,请创建密码重置用户流:

  1. 在 Azure 门户中,转到 Azure AD B2C 租户概述。
  2. 在“ 策略”下的左侧菜单中,选择 “用户流”,然后选择“ 新建用户流”。
  3. “创建用户流”中,选择 “密码重置 用户流”。
  4. “选择版本”下,选择“ 建议”,然后选择“ 创建”。
  5. 对于 “名称”,请输入用户流的名称。 例如 ,passwordreset1
  6. 对于 标识提供者请使用用户名启用重置密码 ,或使用 电子邮件地址重置密码
  7. 多重身份验证下,如果要要求用户使用第二种身份验证方法验证其标识,请选择方法类型以及何时强制实施多重身份验证。 了解详细信息
  8. 条件访问下,如果已为 Azure AD B2C 租户配置条件访问策略,并且想要在此用户流中使用它们,请选中“ 强制条件访问策略 ”复选框。 无需指定策略名称。 了解详细信息
  9. “应用程序声明”下,选择“ 显示更多”。 选择你希望在发送回应用程序的授权令牌中返回的声明。 例如,选择 “用户的对象 ID”。
  10. 选择“确定”
  11. 选择“ 创建 ”以添加用户流。 B2C_1的前缀会自动添加到名称中。

测试用户流

测试用户流:

  1. 选择你创建的用户流。 在用户流概述页上,选择“ 运行用户流”。
  2. 对于 应用程序,请选择要测试的 Web 应用程序,如之前注册的名为 webapp1 的 Web 应用程序回复 URL 应为 https://jwt.ms
  3. 选择 “运行用户流”,验证要为其重置密码的帐户的电子邮件地址,然后选择“ 继续”。
  4. 更改密码,然后选择“ 继续”。 令牌被返回到 https://jwt.ms ,浏览器会显示它。

创建密码重置策略

自定义策略是上传到 Azure AD B2C 租户以定义用户旅程的一组 XML 文件。 我们提供具有多个预生成策略的 初学者包 ,包括注册和登录、密码重置和配置文件编辑策略。 有关详细信息,请参阅 Azure AD B2C 中的自定义策略入门

排查 Azure AD B2C 用户流和自定义策略问题

你的应用程序需要处理来自 Azure B2C 服务的某些错误。 了解如何排查 Azure AD B2C 的用户流和自定义策略问题。

设置 强制密码重置

使用嵌入式密码重置进行注册和登录