Azure Active Directory B2C を使用して汎用 OpenID Connect でのサインアップおよびサインインを設定する
"開始する前に"、[ポリシーの種類の選択] セレクターを使用して、設定するポリシーの種類を選択します。 Azure Active Directory B2C には、ユーザーがアプリケーションを操作する方法を定義する 2 つの方法 (定義済みのユーザー フローを使用する、または完全に構成可能なカスタム ポリシーを使用する) があります。 この記事で必要な手順は、方法ごとに異なります。
OpenID Connect は OAuth 2.0 を基盤として作成された認証プロトコルであり、セキュリティで保護されたユーザー サインインに使用できます。 Azure AD B2C では、このプロトコルを使用するほとんどの ID プロバイダーがサポートされています。
この記事では、カスタム OpenID Connect ID プロバイダーをユーザー フローに追加する方法について説明します。
重要
エンドポイントは、Azure AD B2C のセキュリティ要件に準拠している必要があります。 以前の TLS バージョンと暗号は非推奨です。 詳細については、Azure AD B2C の TLS および暗号スイートの要件に関するページを参照してください。
前提条件
- ユーザー フローを作成して、ユーザーがアプリケーションにサインアップおよびサインインできるようにします。
- Web アプリケーションを登録します。
- 「Active Directory B2C でのカスタム ポリシーの概要」にある手順を完了します。
- Web アプリケーションを登録します。
ID プロバイダーの追加
- Azure AD B2C テナントの全体管理者として Azure Portal にサインインします。
- 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選択し、[ディレクトリとサブスクリプション] メニューからお使いの Azure AD B2C テナントに切り替えます。
- Azure Portal の左上隅の [すべてのサービス] を選択し、 [Azure AD B2C] を検索して選択します。
- [ID プロバイダー] を選択してから、 [新しい OpenID Connect プロバイダー ] を選択します。
- [名前] を入力します。 たとえば、「Contoso」と入力します。
OpenId Connect ID プロバイダーを定義するには、それをポリシーの拡張ファイル内の ClaimsProviders 要素に追加します。
TrustFrameworkExtensions.xml を開きます。
ClaimsProviders 要素を見つけます。 存在しない場合は、それをルート要素の下に追加します。
新しい ClaimsProvider を次のように追加します。
<ClaimsProvider> <Domain>contoso.com</Domain> <DisplayName>Login with Contoso</DisplayName> <TechnicalProfiles> <TechnicalProfile Id="Contoso-OpenIdConnect"> <DisplayName>Contoso</DisplayName> <Description>Login with your Contoso account</Description> <Protocol Name="OpenIdConnect"/> <Metadata> <Item Key="METADATA">https://your-identity-provider.com/.well-known/openid-configuration</Item> <Item Key="client_id">00000000-0000-0000-0000-000000000000</Item> <Item Key="response_types">code</Item> <Item Key="scope">openid profile</Item> <Item Key="response_mode">form_post</Item> <Item Key="HttpBinding">POST</Item> <Item Key="UsePolicyInRedirectUri">false</Item> </Metadata> <!-- <CryptographicKeys> <Key Id="client_secret" StorageReferenceId="B2C_1A_ContosoSecret"/> </CryptographicKeys> --> <OutputClaims> <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="oid"/> <OutputClaim ClaimTypeReferenceId="tenantId" PartnerClaimType="tid"/> <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name" /> <OutputClaim ClaimTypeReferenceId="surName" PartnerClaimType="family_name" /> <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" /> <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" /> <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" AlwaysUseDefaultValue="true" /> <OutputClaim ClaimTypeReferenceId="identityProvider" PartnerClaimType="iss" /> <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="oid"/> </OutputClaims> <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/> <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/> <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/> <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/> </OutputClaimsTransformations> <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin"/> </TechnicalProfile> </TechnicalProfiles> </ClaimsProvider>
[ID プロバイダー] を構成します。
どの OpenID Connect ID プロバイダーでも、サインインを実行するために必要な情報の多くを含むメタデータ ドキュメントを記述します。 メタデータ ドキュメントには、使用する URL、サービスの公開署名キーの場所などの情報が含まれます。 OpenID Connect メタデータ ドキュメントは、常に .well-known/openid-configuration
で終わるエンドポイントに配置されます。 追加する OpenID Connect ID プロバイダーについては、そのメタデータの URL を入力します。
[メタデータ URL] には、OpenID Connect メタデータ ドキュメントの URL を入力します。
<Item Key="METADATA">
技術プロファイル メタデータで、OpenID Connect メタデータ ドキュメントの URL を入力します。
クライアントの ID とシークレット
ユーザーのサインインを許可するために、ID プロバイダーは、開発者が自身のサービスにアプリケーションを登録する必要があります。 このアプリケーションには、クライアント ID およびクライアント シークレットと呼ばれる ID があります。
クライアント シークレットはオプションです。 ただし、応答の種類が code
である場合は、クライアント シークレットを指定する必要があります。そのシークレットを使用して、コードがトークンと交換されます。
クライアント ID とクライアント シークレットを追加するには、これらの値を ID プロバイダーからコピーし、対応するフィールドに入力します。
<Item Key="client_id">
技術プロファイル メタデータで、クライアント ID を入力します。
ポリシー キーを作成する
クライアント シークレットが必須である場合は、ご利用の Azure AD B2C テナントで前に記録したクライアント シークレットを格納してください。
Azure portal にサインインします。
ご自分の Azure AD B2C テナントが含まれるディレクトリを必ず使用してください。 ポータル ツールバーの [ディレクトリ + サブスクリプション] フィルターを選択します。
[ポータルの設定] | [Directories + subscriptions](ディレクトリ + サブスクリプション) ページで Azure AD B2C ディレクトリを [ディレクトリ名] リストで見つけ、 [Switch] を選択します。
Azure portal の左上隅にある [すべてのサービス] を選択してから、 [Azure AD B2C] を検索して選択します。
[概要] ページで、 [Identity Experience Framework] を選択します。
[ポリシー キー] を選択し、 [追加] を選択します。
オプションについては、
Manual
を選択します。ポリシー キーの名前を入力します。 たとえば、「
ContosoSecret
」のように入力します。 プレフィックスB2C_1A_
がキーの名前に自動的に追加されます。[シークレット] に、前に記録したクライアント シークレットを入力します。
[キー使用法] として [
Signature
] を選択します。Create をクリックしてください。
CryptographicKeys
XML 要素で、次の要素を追加します。<CryptographicKeys> <Key Id="client_secret" StorageReferenceId="B2C_1A_ContosoSecret"/> </CryptographicKeys>
スコープ
スコープは、ID プロバイダーから収集する情報およびアクセス許可、たとえば openid profile
を定義します。 ID プロバイダーから ID トークンを受け取るには、openid
スコープを指定する必要があります。
ID トークンがないと、ユーザーはカスタム ID プロバイダーを使用して Azure AD B2C にサインインすることはできません。 別のスコープをスペースで区切って追加することもできます。 使用可能な他のスコープについては、カスタム ID プロバイダーのドキュメントを参照してください。
[スコープ] で、ID プロバイダーからのスコープを入力します。 たとえば、「 openid profile
」のように入力します。
<Item Key="scope">
技術プロファイル メタデータで、ID プロバイダーからのスコープを入力します。 たとえば、「 openid profile
」のように入力します。
応答の種類
応答の種類は、最初の呼び出しで、カスタム ID プロバイダーのauthorization_endpoint
に送信される情報の種類を表します。 次の応答の種類を使用できます。
code
: 承認コード フローに従って、Azure AD B2C にコードが返されます。 次に Azure AD B2C がtoken_endpoint
を呼び出して、トークンのコードを交換します。id_token
: ID トークンが、カスタム ID プロバイダーから、Azure AD B2C に返されます。
[応答の種類] で、自分の ID プロバイダー設定に従って、code
または id_token
を選択します。
<Item Key="response_types">
技術プロファイル メタデータで、自分の ID プロバイダー設定に従って、code
または id_token
を選択します。
応答モード
応答モードは、カスタム ID プロバイダーから Azure AD B2C へのデータの返送に使用する方法を定義します。 次の応答モードを使用できます。
form_post
: 最高のセキュリティを得るには、この応答モードをお勧めします。 この応答は、HTTP のPOST
メソッドによって送信され、本文には、application/x-www-form-urlencoded
形式を使用してエンコードされたコードまたはトークンが含まれます。query
: このコードまたはトークンは、クエリ パラメーターとして返されます。
[応答モード] で、自分の ID プロバイダー設定に従って、form_post
または query
を選択します。
<Item Key="response_mode">
技術プロファイル メタデータで、自分の ID プロバイダー設定に従って、form_post
または query
を選択します。
ドメインのヒント
ドメインのヒントを使用して、ユーザーは利用可能な ID プロバイダーのリストから選択するのではなく、指定した ID プロバイダーのサインイン ページに直接スキップできます。
このような動作を許可にするには、ドメインのヒントの値を入力します。 カスタム ID プロバイダーにジャンプするには、サインインのために Azure AD B2C を呼び出すときに、要求の最後にパラメーター domain_hint=<domain hint value>
を追加します。
[ドメイン ヒント] で、ドメイン ヒントで使用されるドメイン名を入力します。
<Domain>contoso.com</Domain>
技術プロファイル XML 要素で、ドメイン ヒントで使用されるドメイン名を入力します。 たとえば、「 contoso.com
」のように入力します。
要求のマッピング
カスタム ID プロバイダーが Azure AD B2C に ID トークンを返送した後、Azure AD B2C は、受け取ったトークンからのクレームを Azure AD B2C が認識して使用するクレームにマッピングできる必要があります。 以下の各マッピングについては、カスタム ID プロバイダーのドキュメントを参照して、ID プロバイダーのトークンに返される要求をご理解ください。
- ユーザー ID: サインインしたユーザーの "一意の識別子" を指定する要求を入力します。
- 表示名: ユーザーの "表示名" または "フル ネーム" を指定する要求を入力します。
- 名: ユーザーの "名" を指定する要求を入力します。
- 姓: ユーザーの "姓" を指定する要求を入力します。
- メール: ユーザーの "メール アドレス" を指定する要求を入力します。
OutputClaims
要素には、ご利用の ID プロバイダーにより返されるクレームの一覧が含まれます。 ご利用のポリシーに定義されているクレームの名前を、ID プロバイダーで定義されている名前にマップします。 <OutputClaims>
要素で、ご利用の ID プロバイダーで定義されているように、対応するクレーム名を使用して PartnerClaimType
属性を構成します。
ClaimTypeReferenceId | PartnerClaimType |
---|---|
issuerUserId |
サインインしたユーザーの "一意の識別子" を指定する要求を入力します。 |
displayName |
ユーザーの "表示名" または "フル ネーム" を指定する要求を入力します。 |
givenName |
ユーザーの "名" を指定する要求を入力します。 |
surName |
ユーザーの "姓" を指定する要求を入力します。 |
email |
ユーザーの "メール アドレス" を指定する要求を入力します。 |
identityProvider |
トークン発行者名が指定されているクレームを入力します。 たとえば、「 iss 」のように入力します。 ID プロバイダーによってトークンに発行者クレームが含まれていない場合は、ご利用の ID プロバイダーの一意識別子を使用して DefaultValue 属性を設定します。 たとえば、「 DefaultValue="contoso.com" 」のように入力します。 |
ユーザー フローに ID プロバイダーを追加する
- Azure AD B2C テナントで、 [ユーザー フロー] を選択します。
- ID プロバイダーを追加するユーザー フローをクリックします。
- [ソーシャル ID プロバイダー] の下で、追加した ID プロバイダーを選択します。 たとえば、Contoso です。
- [保存] を選択します。
ユーザー フローをテストする
- ポリシーをテストするには、 [ユーザー フローを実行します] を選択します。
- [アプリケーション] には、以前に登録した testapp1 という名前の Web アプリケーションを選択します。 [応答 URL] に
https://jwt.ms
と表示されます。 - [ユーザー フローを実行します] ボタンを選択します。
- サインアップまたはサインイン ページで、サインインする ID プロバイダーを選択します。 たとえば、Contoso です。
サインイン プロセスが成功すると、ブラウザーは https://jwt.ms
にリダイレクトされ、Azure AD B2C によって返されたトークンの内容が表示されます。
ユーザー体験を追加する
この時点では、ID プロバイダーはセットアップされていますが、サインイン ページではまだ使用できません。 独自のカスタム ユーザー体験がない場合は、既存のテンプレート ユーザー体験の複製を作成してください。そうでない場合は、次の手順に進みます。
- スターター パックから TrustFrameworkBase.xml ファイルを開きます。
Id="SignUpOrSignIn"
を含む UserJourney 要素を見つけ、その内容全体をコピーします。- TrustFrameworkExtensions.xml を開き、UserJourneys 要素を見つけます。 要素が存在しない場合は追加します。
- コピーした UserJourney 要素の内容全体を UserJourneys 要素の子として貼り付けます。
- ユーザー体験の ID の名前を変更します。 たとえば、「
Id="CustomSignUpSignIn"
」のように入力します。
ユーザー体験に ID プロバイダーを追加する
これでユーザー体験ができたので、ユーザー体験に新しい ID プロバイダーを追加します。 最初にサインイン ボタンを追加してから、ボタンをアクションにリンクします。 アクションは、前に作成した技術プロファイルです。
ユーザー体験内で、
Type="CombinedSignInAndSignUp"
またはType="ClaimsProviderSelection"
を含むオーケストレーション ステップ要素を見つけます。 これは通常、最初のオーケストレーション ステップです。 ClaimsProviderSelections 要素には、ユーザーがサインインに使用できる ID プロバイダーの一覧が含まれています。 要素の順序により、ユーザーに表示されるサインイン ボタンの順序が制御されます。 ClaimsProviderSelection XML 要素を追加します。 TargetClaimsExchangeId の値をフレンドリ名に設定します。次のオーケストレーション ステップで、ClaimsExchange 要素を追加します。 ID を、ターゲットの要求交換 ID の値に設定します。TechnicalProfileReferenceId の値を、前に作成した技術プロファイルの ID に更新します。
次の XML は、ID プロバイダーを使用したユーザー体験の最初の 2 つのオーケストレーション ステップを示しています。
<OrchestrationStep Order="1" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="api.signuporsignin">
<ClaimsProviderSelections>
...
<ClaimsProviderSelection TargetClaimsExchangeId="ContosoExchange" />
</ClaimsProviderSelections>
...
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
...
<ClaimsExchanges>
<ClaimsExchange Id="ContosoExchange" TechnicalProfileReferenceId="Contoso-OpenIdConnect" />
</ClaimsExchanges>
</OrchestrationStep>
証明書利用者ポリシーを構成する
証明書利用者ポリシー (例 SignUpSignIn.xml) は、Azure AD B2C が実行されるユーザー体験を指定します。 証明書利用者内の DefaultUserJourney 要素を検索します。 ID プロバイダーを追加したユーザー体験 ID と一致するように ReferenceId を更新します。
次の例では、CustomSignUpSignIn
ユーザー体験について、ReferenceId を CustomSignUpSignIn
に設定しています。
<RelyingParty>
<DefaultUserJourney ReferenceId="CustomSignUpSignIn" />
...
</RelyingParty>
カスタム ポリシーをアップロードする
- Azure portal にサインインします。
- ポータル ツール バーにある [ディレクトリ + サブスクリプション] アイコンを選択し、Azure AD B2C テナントを含むディレクトリを選択します。
- Azure portal で、 [Azure AD B2C] を検索して選択します。
- [ポリシー] で [Identity Experience Framework] を選択します。
- [カスタム ポリシーのアップロード] を選択し、変更した 2 つのポリシー ファイルを拡張ポリシー (
TrustFrameworkExtensions.xml
など)、証明書利用者ポリシー (SignUpSignIn.xml
など) の順序でアップロードします。
- 証明書利用者ポリシー (
B2C_1A_signup_signin
など) を選択します。 - [アプリケーション] には、前に登録した Web アプリケーションを選択します。 [応答 URL] に
https://jwt.ms
と表示されます。 - [今すぐ実行] ボタンを選択します。
- サインアップまたはサインイン ページで、 [Contoso] を選択して、Google アカウントでサインインします。
サインイン プロセスが成功すると、ブラウザーは https://jwt.ms
にリダイレクトされ、Azure AD B2C によって返されたトークンの内容が表示されます。
既知の問題
- Azure AD B2C では、暗号化されたトークンを OpenID 接続 ID プロバイダーと交換するための JWE (JSON Web Encryption) はサポートされていません。
次のステップ
詳細については、OpenId Connect 技術プロファイルのリファレンス ガイドを参照してください。