Azure Active Directory B2C でパスワードのリセット フローを設定する
"開始する前に"、[ポリシーの種類の選択] セレクターを使用して、設定するポリシーの種類を選択します。 Azure Active Directory B2C には、ユーザーがアプリケーションを操作する方法を定義する 2 つの方法 (定義済みのユーザー フローを使用する、または完全に構成可能なカスタム ポリシーを使用する) があります。 この記事で必要な手順は、方法ごとに異なります。
サインアップとサインインの流れでは、ユーザーは [パスワードを忘れた場合] リンクを使用することによって自分のパスワードをリセットできます。 このセルフサービス パスワード リセット フローは、サインインにメール アドレスまたはユーザー名とパスワードを使用する Azure Active Directory B2C (Azure AD B2C) のローカル アカウントに適用されます。
パスワードのリセット フローでは、次の手順を実行します。
- サインアップとサインインのページで [パスワードを忘れた場合] リンクを選択します。 Azure AD B2C によってパスワードのリセット フローが開始されます。
- 次のダイアログ ボックスが表示されたら、ユーザーはメール アドレスを入力して、 [確認コードを送信する] を選択します。 Azure AD B2C によってユーザーのメール アカウントに確認コードが送信されます。 ユーザーは、メールから確認コードをコピーし、Azure AD B2C のパスワードのリセット ダイアログにそのコードを入力して、 [コードの確認] を選択します。
- ユーザーは次に、新しいパスワードを入力できます。 (メールの確認後も、ユーザーは [電子メールの変更] ボタンを選択できます。「電子メールの変更ボタンを非表示にする」を参照してください。)
ヒント
ユーザーは、自分のパスワードを忘れてリセットしたい場合は、セルフサービス パスワード リセット フローを使用してパスワードを変更できます。 また、次のユーザー フロー オプションのいずれかを選択することもできます。
- ユーザーが自分のパスワードを知っていて、それを変更したい場合は、パスワード変更フローを使用します。
- ユーザーにパスワードの変更を強制する場合は (たとえば、はじめてサインインするとき、管理者がユーザーのパスワードをリセットしたとき、Azure AD B2C にユーザーを移行してランダムなパスワードを割り当てたとき)、パスワードのリセットの強制フローを使用します。
selfAsserted.html での [電子メールの変更] ボタンの既定の名前は changeclaims です。 ボタン名を見つけるには、サインアップ ページで、Inspect などのブラウザー ツールを使用してページのソースを調べます。
前提条件
- ユーザー フローを作成して、ユーザーがアプリケーションにサインアップおよびサインインできるようにします。
- Web アプリケーションを登録します。
- 「Active Directory B2C でのカスタム ポリシーの概要」にある手順を完了します。
- Web アプリケーションを登録します。
電子メールの変更ボタンを非表示にする
メールの検証が完了した後でも、ユーザーは [電子メールの変更] を選択し、別のメール アドレスを入力して、メールの検証を繰り返すことができます。 [電子メールの変更] ボタンを非表示にしたい場合は、CSS を変更して、ダイアログの関連付けられた HTML 要素を非表示にすることができます。 たとえば、次の CSS エントリを selfAsserted.html に追加し、HTML テンプレートを使用してユーザー インターフェイスをカスタマイズすることができます。
<style type="text/css">
.changeClaims
{
visibility: hidden;
}
</style>
セルフサービス パスワード リセット (推奨)
新しいパスワード リセット エクスペリエンスが、サインアップやサインインのポリシーの一部になりました。 ユーザーが [パスワードを忘れた場合] リンクを選択すると、すぐにパスワードを忘れた場合のエクスペリエンスが表示されます。 アプリケーションでは、AADB2C90118 エラー コードを処理する必要がなくなりました。また、パスワード リセット用の別個のポリシーは必要ありません。
セルフサービス パスワード リセットのエクスペリエンスは、サインイン (推奨) またはサインアップとサインイン (推奨) のユーザー フローで構成できます。 どちらのユーザー フローの設定もない場合は、サインインとサインアップのユーザー フローを作成します。
サインアップまたはサインインのユーザー フロー用のセルフサービス パスワード リセットを設定するには:
- Azure portal にサインインします。
- 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選択し、[ディレクトリとサブスクリプション] メニューからお使いの Azure AD B2C テナントに切り替えます。
- Azure portal で、 [Azure AD B2C] を検索して選択します。
- [ユーザー フロー] を選択します。
- カスタマイズする (種類が [推奨] である) サインアップまたはサインインのユーザー フローを選択します。
- メニューの [設定] で、 [プロパティ] を選択します。
- [Password configuration](パスワードの構成) で、 [セルフサービス パスワード リセット] を選択します。
- [保存] を選択します。
- 左側のメニューで、 [カスタマイズ] の [ページ レイアウト] を選択します。
- [Page Layout Version](ページ レイアウトのバージョン) で、2.1.3 以降を選択します。
- [保存] を選択します。
以降のセクションでは、セルフサービス パスワード エクスペリエンスをカスタム ポリシーに追加する方法について説明します。 このサンプルは、カスタム ポリシー スターター パックに含まれるポリシー ファイルに基づいています。
ヒント
パスワード リセットを含むサインアップまたはサインイン ポリシーの完全なサンプルは、GitHub にあります。
ユーザーが [パスワードを忘れた場合] リンクを選択したことを示す
ユーザーが [パスワードを忘れた場合] リンクを選択したことをポリシーに示すには、ブール値のクレームを定義します。 ユーザー体験を、パスワードを忘れた場合の技術プロファイルに移動させるには、クレームを使用します。 このクレームをトークンに対して発行し、ユーザーがパスワードを忘れた場合のユーザー フローを使用してサインインしたことが、アプリケーションで検出されるようにすることもできます。
クレームは、クレーム スキーマ内で宣言します。 ポリシーの拡張ファイル (例: SocialAndLocalAccounts/TrustFrameworkExtensions.xml) を開きます。
BuildingBlocks 要素を検索します。 要素が存在しない場合は追加します。
ClaimsSchema 要素を見つけます。 要素が存在しない場合は追加します。
次の要求を 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 が必要です。 ページ レイアウトのバージョンをアップグレードするには:
ポリシーの基本ファイルを開きます (例: SocialAndLocalAccounts/TrustFrameworkBase.xml)。
BuildingBlocks 要素を検索します。 要素が存在しない場合は追加します。
ContentDefinitions 要素を見つけます。 要素が存在しない場合は追加します。
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
に設定されます。
- ポリシーの拡張ファイル (例: SocialAndLocalAccounts/TrustFrameworkExtensions.xml) を開きます。
- 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
型のサブ体験を使用します。
- ポリシーの拡張ファイル (SocialAndLocalAccounts/TrustFrameworkExtensions.xml など) を開きます。
- 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 ステップを含む独自のカスタム ユーザー体験を用意していない場合は、次の手順のようにして、既存のサインアップまたはサインインのユーザー体験を複製します。 そうでない場合は、次の手順に進みます。
- スターター パックで、TrustFrameworkBase.xml ファイル (SocialAndLocalAccounts/TrustFrameworkBase.xml など) を開きます。
Id="SignUpOrSignIn"
を含む UserJourney 要素を見つけ、その内容全体をコピーします。- TrustFrameworkExtensions.xml ファイル (SocialAndLocalAccounts/TrustFrameworkExtensions.xml など) を開き、UserJourneys 要素を見つけます。 要素が存在しない場合は作成します。
- 手順 2. でコピーした UserJourney 要素の内容全体を貼り付けて、UserJourneys 要素の子要素を作成します。
- ユーザー体験の ID の名前を変更します。 たとえば、「
Id="CustomSignUpSignIn"
」のように入力します。
パスワードを忘れた場合のリンクを、パスワードを忘れた場合のサブ体験に接続する
ユーザー体験内では、パスワードを忘れた場合のサブ体験を ClaimsProviderSelection として表現できます。 この要素を追加して、[パスワードを忘れた場合] リンクを、パスワードを忘れた場合のサブ体験に接続させます。
TrustFrameworkExtensions.xml ファイル (SocialAndLocalAccounts/TrustFrameworkExtensions.xml など) を開きます。
ユーザー体験内で、
Type="CombinedSignInAndSignUp"
またはType="ClaimsProviderSelection"
を含むオーケストレーション ステップ要素を見つけます。 これは通常、最初のオーケストレーション ステップです。 ClaimsProviderSelections 要素には、ユーザーがサインインに使用できる ID プロバイダーの一覧が含まれています。 次の行を追加します。<ClaimsProviderSelection TargetClaimsExchangeId="ForgotPasswordExchange" />
次のオーケストレーション手順で、次の行を追加して ClaimsExchange 要素を追加します。
<ClaimsExchange Id="ForgotPasswordExchange" TechnicalProfileReferenceId="ForgotPassword" />
現在のステップと次のステップの間に、次のオーケストレーション ステップを追加します。 追加した新しいオーケストレーション ステップによって、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>
新しいオーケストレーション ステップを追加した後、ステップの番号には、1 から N の整数がスキップされずに順番に付け替えられます。
実行するユーザー体験を設定する
これでユーザー体験を変更または作成したので、証明書利用者セクションで、このカスタム ポリシーに対して Azure AD B2C によって実行される体験を指定します。
Relying Party 要素を含むファイル (SocialAndLocalAccounts/SignUpOrSignin.xml など) を開きます。
RelyingParty 要素内で、DefaultUserJourney 要素を見つけます。
ClaimsProviderSelections を追加したユーザー体験の ID と一致するように、DefaultUserJourney ReferenceId を更新します。
<RelyingParty>
<DefaultUserJourney ReferenceId="CustomSignUpSignIn" />
...
</RelyingParty>
パスワードを忘れた場合のフローをアプリに示す
アプリケーションで、パスワードを忘れた場合のユーザー フローを使用して、ユーザーがサインインしたかどうかを検出する必要がある場合があります。 isForgotPassword クレームには、それが行われたことを示すブール値が含まれています。 このクレームは、アプリケーションに送信されるトークン内で発行できます。 必要に応じて、証明書利用者 セクションで出力クレームに isForgotPassword を追加します。 アプリケーションで isForgotPassword クレームを調べて、ユーザーがパスワードをリセットしているかどうかを確認できます。
<RelyingParty>
<OutputClaims>
...
<OutputClaim ClaimTypeReferenceId="isForgotPassword" DefaultValue="false" />
</OutputClaims>
</RelyingParty>
カスタム ポリシーをアップロードする
- Azure portal にサインインします。
- 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選択し、[ディレクトリとサブスクリプション] メニューから Azure AD B2C テナントに切り替えてください。
- Azure portal で、 [Azure AD B2C] を検索して選択します。
- メニューの [ポリシー] で、 [Identity Experience Framework] を選択します。
- [カスタム ポリシーのアップロード] を選択します。 次の順序で、変更したポリシー ファイルをアップロードします。
- ポリシーの基本ファイル (TrustFrameworkBase.xml など)。
- 拡張ポリシー (例: TrustFrameworkExtensions.xml)。
- 証明書利用者ポリシー (例: SignUpSignIn.xml)。
パスワード リセット フローをテストする
- テストする (推奨の種類) サインアップまたはサインインのユーザー フローを選択します。
- [ユーザー フローを実行します] を選択します。
- [アプリケーション] で、前に登録した webapp1 という名前の Web アプリケーションを選択します。 [応答 URL] に
https://jwt.ms
と表示されます。 - [ユーザー フローを実行します] を選択します。
- サインアップまたはサインインのページで、 [パスワードを忘れた場合] を選択します。
- 前に作成したアカウントの電子メール アドレスを確認してから、 [続行] を選択します。
- 表示されたダイアログで、ユーザーのパスワードを変更し、 [続行] を選択します。 トークンが
https://jwt.ms
に返され、ブラウザーにそれが表示されます。 - 返されたトークンの isForgotPassword クレームの値を調べます。 それが存在していて
true
に設定されている場合、ユーザーはパスワードをリセットしています。
パスワード リセット ポリシー (レガシ)
セルフサービス パスワード リセットのエクスペリエンスが有効になっていない場合、このリンクを選択しても、パスワードのリセット ユーザー フローは自動的にトリガーされません。 代わりに、エラー コード AADB2C90118
がアプリケーションに返されます。 アプリケーションで、認証ライブラリを再初期化して Azure AD B2C のパスワードのリセット ユーザー フローを認証することで、このエラー コードを処理する必要があります。
次の図は、このプロセスを示しています。
アプリケーションで、ユーザーが [サインイン] を選択します。 アプリによって承認要求が開始され、ユーザーがサインインを完了できるように Azure AD B2C にリダイレクトされます。 承認要求では、B2C_1_signup_signin などの、サインアップまたはサインインのポリシー名が指定されています。
ユーザーは [パスワードを忘れた場合] リンクを選択します。 Azure AD B2C によって、アプリケーションに
AADB2C90118
エラー コードが返されます。アプリケーションはエラー コードを処理し、新しい承認要求を開始します。 承認要求では、B2C_1_pwd_reset などのパスワード リセット ポリシーの名前を指定します。
基本的な ASP.NET サンプルで、ユーザー フローのリンク方法を確認できます。
パスワードのリセット ユーザー フローを作成する
アプリケーションのユーザーが自分のパスワードをリセットできるようにするには、パスワード リセット ユーザー フローを作成します。
- Azure portal で、Azure AD B2C テナントの概要に移動します。
- 左側のメニューで、 [ポリシー] の下の [ユーザー フロー] を選択し、 [新しいユーザー フロー] を選択します。
- [ユーザー フローの作成] で、 [パスワード リセット] ユーザー フローを選択します。
- [バージョンの選択] で [Recommended](推奨) を選択して、 [作成] を選択します。
- [名前] に、ユーザー フローの名前を入力します。 たとえば、「passwordreset1」と入力します。
- [Identity providers](ID プロバイダー) で [Reset password using username](ユーザー名を使用してパスワードをリセット) または [Reset password using email address](メール アドレスを使用してパスワードをリセット) を有効にします。
- 2 番目の認証方法を使用して ID 確認をユーザーに求める場合は、 [多要素認証] で、方法の種類と、多要素認証をいつ実施するかを選択します。 詳細については、こちらを参照してください。
- Azure AD B2C テナントで条件付きアクセス ポリシーを構成してあり、それをこのユーザー フローで使用する場合は、 [条件付きアクセス] の [Enforce conditional access policies](条件付きアクセス ポリシーを適用する) チェック ボックスをオンにします。 ポリシー名を指定する必要はありません。 詳細については、こちらを参照してください。
- [アプリケーション要求] の [さらに表示] を選択します。 アプリケーションに送り返される承認トークンで返されるクレームを選択します。 たとえば、 [User's Object ID] (ユーザーのオブジェクト ID) を選択します。
- [OK] を選択します。
- [作成] を選択して、ユーザー フローを追加します。 B2C_1 というプレフィックスが自動的に名前に追加されます。
ユーザー フローをテストする
ユーザー フローをテストするには:
- 作成したユーザー フローを選択します。 ユーザー フローの [概要] ページで、 [ユーザー フローを実行します] を選択します。
- [アプリケーション] で、テストする Web アプリケーション (webapp1 という名前のアプリケーションなど) を選択します (それを以前に登録した場合)。 [応答 URL] に
https://jwt.ms
と表示される必要があります。 - [ユーザー フローの実行] を選択し、パスワードをリセットするアカウントの電子メール アドレスを確認して [続行] を選択します。
- パスワードを変更し、 [続行] を選択します。 トークンが
https://jwt.ms
に返され、ブラウザーにそれが表示されます。
パスワードのリセット ポリシーを作成する
カスタム ポリシーは、ユーザー体験を定義するために Azure AD B2C テナントにアップロードする XML ファイルのセットです。 サインアップとサインイン、パスワードのリセット、プロファイル編集ポリシーなど、いくつかの事前に構築されたポリシーを含むスターター パックが用意されています。 詳細については、「Azure AD B2C でのカスタム ポリシーの概要」を参照してください。
Azure AD B2C のユーザー フローとカスタム ポリシーのトラブルシューティング
アプリケーション側で、Azure B2C サービスから生成された特定のエラーを処理する必要があります。 Azure AD B2C のユーザー フローとカスタム ポリシーのトラブルシューティング方法に関するページを参照してください。
次のステップ
パスワードの強制リセットを設定します。