在 Azure Active Directory B2C 中設定密碼重設流程

開始之前,使用 [選擇原則類型] 選取器來選擇您要設定的原則類型。 Azure Active Directory B2C 提供兩種方法來定義使用者如何與您的應用程式互動:透過預先定義的使用者流程,或透過完全可設定的自訂原則。 此文章中所需的步驟隨各方法而異。

註冊和登入旅程圖中,使用者可以使用 [忘記密碼了嗎?] 連結來重設自己的密碼。 此自助式密碼重設流程適用於 Azure Active Directory B2C (Azure AD B2C) 中的本機帳戶,而本機帳戶使用電子郵件地址或搭配使用使用者名稱與密碼以進行登入。

密碼重設流程包含下列步驟:

  1. 在註冊和登入頁面上,使用者選取 [忘記密碼了嗎?] 連結。 Azure AD B2C 會起始密碼重設流程。

  2. 在出現的下一個對話方塊中,使用者輸入其電子郵件地址,然後選取 [傳送驗證碼]。 Azure AD B2C 會將驗證碼傳送至使用者的電子郵件帳戶。 使用者會從電子郵件複製驗證碼,並在 Azure AD B2C 密碼重設對話方塊中輸入該代碼,然後選取 [驗證代碼]。

  3. 使用者接著可以輸入新密碼 (確認電子郵件之後,使用者仍然可以選取 [變更電子郵件] 按鈕;請參閱隱藏變更電子郵件按鈕)。

    顯示密碼重設流程中三個對話方塊的圖表。

提示

如果使用者忘記其密碼,並想要重設密碼,則可以使用自助式密碼重設流程來變更密碼。 選擇下列其中一個使用者流程選項:

  • 如果使用者知道其密碼,並想要進行變更,則請使用密碼變更流程
  • 如果您想要強制使用者重設其密碼 (例如,他們第一次登入時、管理員已重設他們的密碼時,或已使用隨機密碼將他們移轉至 Azure AD B2C 之後),則請使用強制密碼重設流程。

隱藏變更電子郵件按鈕

確認電子郵件之後,使用者仍然可以選取 [變更電子郵件]、並輸入另一個電子郵件地址,然後重複電子郵件驗證。 如果您想要隱藏 [變更電子郵件] 按鈕,則可以修改 CSS 來隱藏對話方塊中的相關聯 HTML 元素。 例如,您可以將下列 CSS 項目新增至 selfAsserted.html,並使用 HTML 範本來自訂使用者介面

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

selfAsserted.html 中 [變更電子郵件] 按鈕的預設名稱是 changeclaims。 若要尋找按鈕名稱,請在註冊頁面上,使用 [檢查] 這類瀏覽器工具來檢查頁面來源。

必要條件

新的密碼重設體驗現在是註冊或登入原則的一部分。 使用者在選取 [忘記密碼了嗎?] 連結時會被立即傳送至 [忘記密碼] 體驗。 您的應用程式不再需要處理 AADB2C90118 錯誤碼,而且您不需要個別的密碼重設原則。

您可以針對登入 (建議) 或註冊和登入 (建議) 使用者流程設定自助式密碼重設體驗。 如果您未設定其中一種使用者流程,則請建立註冊或登入使用者流程。

設定註冊或登入使用者流程的自助式密碼重設:

  1. 登入 Azure 入口網站
  2. 在入口網站工具列中,選取 [目錄 + 訂用帳戶] 圖示。
  3. 在 [入口網站設定] | [目錄 + 訂用帳戶] 窗格中,於 [目錄名稱] 清單中找出 Azure AD B2C 目錄,然後選取 [切換]。
  4. 在 Azure 入口網站中,搜尋並選取 [Azure AD B2C]。
  5. 選取 [使用者流程]
  6. 選取您想要自訂的註冊或登入使用者流程 ([建議] 類型)。
  7. 在功能表的 [設定] 下,選取 [屬性]。
  8. 在 [密碼設定] 下,選取 [自助式密碼重設]。
  9. 選取 [儲存]。
  10. 在左側功能表的 [自訂] 下,選取 [頁面配置]。
  11. 在 [頁面配置版本] 中,選取 [2.1.3] 或更新版本。
  12. 選取 [儲存]。

下列各節說明如何將自助式密碼體驗新增至自訂原則。 此範例是以自訂原則入門套件中所含的原則檔案為基礎。

提示

您可以在 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 元素,使其具有識別碼 api.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 技術設定檔 UseTechnicalProfileForSessionManagementSM-AAD 工作階段管理員,使用者才能在 SSO 條件下成功執行後續登入。

新增密碼重設子旅程圖

使用者現在可以在您的使用者旅程圖中登入、註冊以及執行密碼重設。 若要更妥善地組織使用者旅程圖,您可以使用子旅程圖來處理密碼重設流程。

子旅程圖是從使用者旅程圖中進行呼叫,並執行將密碼重設體驗提供給使用者的特定步驟。 使用 Call 類型子旅程圖,這樣,在子旅程圖完成時,控制權會返回起始子旅程圖的協調流程步驟。

  1. 開啟原則的副檔名檔案,例如 SocialAndLocalAccounts/TrustFrameworkExtensions.xml
  2. 尋找 SubJourneys 元素。 如果此元素不存在,則請將它新增至 [使用者旅程圖] 元素後面。 然後,新增下列子旅程圖:
<!--
<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 元素中的 [忘記密碼] 子旅程圖識別碼。

如果您自己的自訂使用者旅程圖沒有 CombinedSignInAndSignUp 步驟,則請完成下列步驟,以複製現有註冊或登入使用者旅程圖。 否則,請繼續下一節。

  1. 在入門套件中,開啟 TrustFrameworkBase.xml 檔案,例如 SocialAndLocalAccounts/TrustFrameworkBase.xml
  2. 尋找並複製包含 Id="SignUpOrSignIn"UserJourney 元素的整個內容。
  3. 開啟 TrustFrameworkExtensions.xml 檔案,例如 SocialAndLocalAccounts/TrustFrameworkExtensions.xml,然後尋找 UserJourneys 元素。 如果專案不存在,請加以建立。
  4. 貼上您在步驟 2 中複製的完整 UserJourney 元素內容,以建立 UserJourneys 元素的子元素。
  5. 重新命名使用者旅程圖的識別碼。 例如: 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 的使用者旅程圖識別碼。

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

指出您應用程式的忘記密碼流程

您的應用程式可能需要使用 [忘記密碼] 使用者流程來偵測使用者是否已登入。 isForgotPassword 宣告包含指出它們已執行的布林值。 宣告可以在傳送至應用程式的權杖中發出。 如有必要,請將 isForgotPassword 新增至 [信賴憑證者] 區段中的輸出宣告。 您的應用程式可以檢查 isForgotPassword 宣告,以判斷使用者是否重設其密碼。

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

上傳自訂原則

  1. 登入 Azure 入口網站
  2. 在入口網站工具列中,選取 [目錄 + 訂用帳戶] 圖示。
  3. 在 [入口網站設定] | [目錄 + 訂用帳戶] 窗格中,於 [目錄名稱] 清單中找出 Azure AD B2C 目錄,然後選取 [切換]。
  4. 在 Azure 入口網站中,搜尋並選取 [Azure AD B2C]。
  5. 在功能表的 [原則] 下,選取 [Identity Experience Framework]。
  6. 選取 [上傳自訂原則]。 依照下列順序,上傳您所變更的兩個原則檔案:
    1. 擴充原則,例如 SocialAndLocalAccounts/TrustFrameworkExtensions.xml
    2. 信賴憑證者原則,例如 SocialAndLocalAccounts/SignUpOrSignin.xml

測試密碼重設流程

  1. 選取您想要測試的註冊或登入使用者流程 ([建議] 類型)。
  2. 選取 [執行使用者流程]。
  3. 針對 [應用程式],選取先前註冊名為 webapp1 的 Web 應用程式。 Reply 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. 在 [應用程式宣告] 下,選取 [顯示更多]。 選擇您想要在授權權杖中傳回的宣告,而授權權杖會傳回給應用程式。 例如,選取 [使用者的物件識別碼]。
  10. 選取 [確定]。
  11. 選取 [建立] 以新增使用者流程。 名稱會自動新增前置詞 B2C_1。

測試使用者流程

測試使用者流程:

  1. 選取您所建立的使用者流程。 在使用者流程的概觀頁面上,選取 [執行使用者流程]。
  2. 針對 [應用程式],選取先前註冊名為 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 使用者流程和自訂原則進行疑難排解

後續步驟

設定強制密碼重設

註冊並以內嵌密碼重設來登入