Azure Active Directory B2C でパスワードのリセット フローを設定する

"開始する前に"、[ポリシーの種類の選択] セレクターを使用して、設定するポリシーの種類を選択します。 Azure Active Directory B2C には、ユーザーがアプリケーションを操作する方法を定義する 2 つの方法 (定義済みのユーザー フローを使用する、または完全に構成可能なカスタム ポリシーを使用する) があります。 この記事で必要な手順は、方法ごとに異なります。

サインアップとサインインの流れでは、ユーザーは [パスワードを忘れた場合] リンクを使用することによって自分のパスワードをリセットできます。 このセルフサービス パスワード リセット フローは、サインインにメール アドレスまたはユーザー名とパスワードを使用する Azure Active Directory B2C (Azure AD B2C) のローカル アカウントに適用されます。

パスワードのリセット フローでは、次の手順を実行します。

  1. サインアップとサインインのページで [パスワードを忘れた場合] リンクを選択します。 Azure AD B2C によってパスワードのリセット フローが開始されます。
  2. 次のダイアログ ボックスが表示されたら、ユーザーはメール アドレスを入力して、 [確認コードを送信する] を選択します。 Azure AD B2C によってユーザーのメール アカウントに確認コードが送信されます。 ユーザーは、メールから確認コードをコピーし、Azure AD B2C のパスワードのリセット ダイアログにそのコードを入力して、 [コードの確認] を選択します。
  3. ユーザーは次に、新しいパスワードを入力できます。 (メールの確認後も、ユーザーは [電子メールの変更] ボタンを選択できます。「電子メールの変更ボタンを非表示にする」を参照してください。)

Diagram that shows three dialogs in the password reset flow.

ヒント

ユーザーは、自分のパスワードを忘れてリセットしたい場合は、セルフサービス パスワード リセット フローを使用してパスワードを変更できます。 また、次のユーザー フロー オプションのいずれかを選択することもできます。

  • ユーザーが自分のパスワードを知っていて、それを変更したい場合は、パスワード変更フローを使用します。
  • ユーザーにパスワードの変更を強制する場合は (たとえば、はじめてサインインするとき、管理者がユーザーのパスワードをリセットしたとき、Azure AD B2C にユーザーを移行してランダムなパスワードを割り当てたとき)、パスワードのリセットの強制フローを使用します。

selfAsserted.html での [電子メールの変更] ボタンの既定の名前は changeclaims です。 ボタン名を見つけるには、サインアップ ページで、Inspect などのブラウザー ツールを使用してページのソースを調べます。

前提条件

電子メールの変更ボタンを非表示にする

メールの検証が完了した後でも、ユーザーは [電子メールの変更] を選択し、別のメール アドレスを入力して、メールの検証を繰り返すことができます。 [電子メールの変更] ボタンを非表示にしたい場合は、CSS を変更して、ダイアログの関連付けられた HTML 要素を非表示にすることができます。 たとえば、次の CSS エントリを selfAsserted.html に追加し、HTML テンプレートを使用してユーザー インターフェイスをカスタマイズすることができます。

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

新しいパスワード リセット エクスペリエンスが、サインアップやサインインのポリシーの一部になりました。 ユーザーが [パスワードを忘れた場合] リンクを選択すると、すぐにパスワードを忘れた場合のエクスペリエンスが表示されます。 アプリケーションでは、AADB2C90118 エラー コードを処理する必要がなくなりました。また、パスワード リセット用の別個のポリシーは必要ありません。

セルフサービス パスワード リセットのエクスペリエンスは、サインイン (推奨) またはサインアップとサインイン (推奨) のユーザー フローで構成できます。 どちらのユーザー フローの設定もない場合は、サインインとサインアップのユーザー フローを作成します。

サインアップまたはサインインのユーザー フロー用のセルフサービス パスワード リセットを設定するには:

  1. Azure portal にサインインします。
  2. 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選択し、[ディレクトリとサブスクリプション] メニューからお使いの Azure AD B2C テナントに切り替えます。
  3. Azure portal で、 [Azure AD B2C] を検索して選択します。
  4. [ユーザー フロー] を選択します。
  5. カスタマイズする (種類が [推奨] である) サインアップまたはサインインのユーザー フローを選択します。
  6. メニューの [設定] で、 [プロパティ] を選択します。
  7. [Password configuration](パスワードの構成) で、 [セルフサービス パスワード リセット] を選択します。
  8. [保存] を選択します。
  9. 左側のメニューで、 [カスタマイズ][ページ レイアウト] を選択します。
  10. [Page Layout Version](ページ レイアウトのバージョン) で、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 要素を ID 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 要素を見つけます。 この要素が存在しない場合は、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" を含む UserJourney 要素を見つけ、その内容全体をコピーします。
  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 要素には、ユーザーがサインインに使用できる ID プロバイダーの一覧が含まれています。 次の行を追加します。

    <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. Relying Party 要素を含むファイル (SocialAndLocalAccounts/SignUpOrSignin.xml など) を開きます。

  2. RelyingParty 要素内で、DefaultUserJourney 要素を見つけます。

  3. ClaimsProviderSelections を追加したユーザー体験の ID と一致するように、DefaultUserJourney ReferenceId を更新します。

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

パスワードを忘れた場合のフローをアプリに示す

アプリケーションで、パスワードを忘れた場合のユーザー フローを使用して、ユーザーがサインインしたかどうかを検出する必要がある場合があります。 isForgotPassword クレームには、それが行われたことを示すブール値が含まれています。 このクレームは、アプリケーションに送信されるトークン内で発行できます。 必要に応じて、証明書利用者 セクションで出力クレームに isForgotPassword を追加します。 アプリケーションで isForgotPassword クレームを調べて、ユーザーがパスワードをリセットしているかどうかを確認できます。

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

カスタム ポリシーをアップロードする

  1. Azure portal にサインインします。
  2. 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選択し、[ディレクトリとサブスクリプション] メニューから Azure AD B2C テナントに切り替えてください。
  3. Azure portal で、 [Azure AD B2C] を検索して選択します。
  4. メニューの [ポリシー] で、 [Identity Experience Framework] を選択します。
  5. [カスタム ポリシーのアップロード] を選択します。 次の順序で、変更したポリシー ファイルをアップロードします。
    1. ポリシーの基本ファイル (TrustFrameworkBase.xml など)。
    2. 拡張ポリシー (例: TrustFrameworkExtensions.xml)。
    3. 証明書利用者ポリシー (例: SignUpSignIn.xml)。

パスワード リセット フローをテストする

  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 などのパスワード リセット ポリシーの名前を指定します。

    Diagram that shows the legacy password reset user flow.

基本的な ASP.NET サンプルで、ユーザー フローのリンク方法を確認できます。

パスワードのリセット ユーザー フローを作成する

アプリケーションのユーザーが自分のパスワードをリセットできるようにするには、パスワード リセット ユーザー フローを作成します。

  1. Azure portal で、Azure AD B2C テナントの概要に移動します。
  2. 左側のメニューで、 [ポリシー] の下の [ユーザー フロー] を選択し、 [新しいユーザー フロー] を選択します。
  3. [ユーザー フローの作成] で、 [パスワード リセット] ユーザー フローを選択します。
  4. [バージョンの選択][Recommended](推奨) を選択して、 [作成] を選択します。
  5. [名前] に、ユーザー フローの名前を入力します。 たとえば、「passwordreset1」と入力します。
  6. [Identity providers](ID プロバイダー)[Reset password using username](ユーザー名を使用してパスワードをリセット) または [Reset password using email address](メール アドレスを使用してパスワードをリセット) を有効にします。
  7. 2 番目の認証方法を使用して ID 確認をユーザーに求める場合は、 [多要素認証] で、方法の種類と、多要素認証をいつ実施するかを選択します。 詳細については、こちらを参照してください
  8. Azure AD B2C テナントで条件付きアクセス ポリシーを構成してあり、それをこのユーザー フローで使用する場合は、 [条件付きアクセス][Enforce conditional access policies](条件付きアクセス ポリシーを適用する) チェック ボックスをオンにします。 ポリシー名を指定する必要はありません。 詳細については、こちらを参照してください
  9. [アプリケーション要求][さらに表示] を選択します。 アプリケーションに送り返される承認トークンで返されるクレームを選択します。 たとえば、 [User's Object ID] (ユーザーのオブジェクト ID) を選択します。
  10. [OK] を選択します。
  11. [作成] を選択して、ユーザー フローを追加します。 B2C_1 というプレフィックスが自動的に名前に追加されます。

ユーザー フローをテストする

ユーザー フローをテストするには:

  1. 作成したユーザー フローを選択します。 ユーザー フローの [概要] ページで、 [ユーザー フローを実行します] を選択します。
  2. [アプリケーション] で、テストする Web アプリケーション (webapp1 という名前のアプリケーションなど) を選択します (それを以前に登録した場合)。 [応答 URL]https://jwt.ms と表示される必要があります。
  3. [ユーザー フローの実行] を選択し、パスワードをリセットするアカウントの電子メール アドレスを確認して [続行] を選択します。
  4. パスワードを変更し、 [続行] を選択します。 トークンが https://jwt.ms に返され、ブラウザーにそれが表示されます。

パスワードのリセット ポリシーを作成する

カスタム ポリシーは、ユーザー体験を定義するために Azure AD B2C テナントにアップロードする XML ファイルのセットです。 サインアップとサインイン、パスワードのリセット、プロファイル編集ポリシーなど、いくつかの事前に構築されたポリシーを含むスターター パックが用意されています。 詳細については、「Azure AD B2C でのカスタム ポリシーの概要」を参照してください。

Azure AD B2C のユーザー フローとカスタム ポリシーのトラブルシューティング

アプリケーション側で、Azure B2C サービスから生成された特定のエラーを処理する必要があります。 Azure AD B2C のユーザー フローとカスタム ポリシーのトラブルシューティング方法に関するページを参照してください。

次のステップ

パスワードの強制リセットを設定します。

埋め込みパスワードリセットを使用したサインアップとサインイン