Azure Active Directory B2C カスタム ポリシーで OAuth2 技術プロファイルを定義する

注意

Azure Active Directory B2C で、カスタム ポリシーは、主に、複雑なシナリオに取り組む用途向けに設計されています。 ほとんどのシナリオで、組み込みユーザー フローを使用することをお勧めします。 まだ行っていない場合は、Active Directory B2C でのカスタム ポリシーの概要に関する記事で、カスタム ポリシー スターター パックの詳細を確認してください。

Azure Active Directory B2C (Azure AD B2C) では、OAuth2 プロトコルの ID プロバイダーのサポートを提供しています。 OAuth2 は、認可および委任された認証のための主要なプロトコルです。 詳細については、「RFC 6749 The OAuth 2.0 Authorization Framework」を参照してください。 OAuth2 技術プロファイルを使用して、Facebook などの OAuth2 ベースの ID プロバイダーとフェデレーションできます。 ID プロバイダーとのフェデレーションにより、ユーザーは、既存のソーシャル ID またはエンタープライズ ID でサインインできます。

Protocol

Protocol 要素の Name 属性は に設定する必要があります。 たとえば、Facebook-OAUTH 技術プロファイル用のプロトコルは です。

<TechnicalProfile Id="Facebook-OAUTH">
  <DisplayName>Facebook</DisplayName>
  <Protocol Name="OAuth2" />
  ...

入力クレーム

InputClaimsInputClaimsTransformations の要素は不要です。 ただし、追加のパラメーターを ID プロバイダーに送信する場合があります。 次の例では、値が である domain_hint クエリ文字列パラメーターを認可要求に追加しています。

<InputClaims>
  <InputClaim ClaimTypeReferenceId="domain_hint" DefaultValue="contoso.com" />
</InputClaims>

出力クレーム

OutputClaims 要素には、OAuth2 ID プロバイダーにより返される要求の一覧が存在します。 お使いのポリシーに定義されている要求の名前を、ID プロバイダーで定義されている名前にマップする必要があるかもしれません。 DefaultValue 属性を設定している限り、ID プロバイダーにより返されない要求を追加することもできます。

OutputClaimsTransformations 要素には、出力要求を修正したり新しい要求を生成するために使用される、OutputClaimsTransformation 要素のコレクションが含まれている場合があります。

次の例は、Facebook ID プロバイダーにより返される要求を示しています。

  • givenName 要求にマップされている first_name 要求。
  • surname 要求にマップされている last_name 要求。
  • どの名前にもマップされていない displayName 要求。
  • どの名前にもマップされていない email 要求。

また、技術プロファイルは、ID プロバイダーにより返されない要求も返します。

  • ID プロバイダーの名前を保持する identityProvider 要求。
  • 既定値の socialIdpAuthentication である authenticationSource 要求。
<OutputClaims>
  <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="id" />
  <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="first_name" />
  <OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="last_name" />
  <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
  <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
  <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="facebook.com" />
  <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" />
</OutputClaims>

承認エンドポイント メタデータ

認可フローは、Azure AD B2C によってユーザーが OAuth2 ID プロバイダー /authorize エンドポイントに送信されるときに開始されます。 承認エンドポイントの呼び出しは、ユーザーがアクションを実行するフローの対話部分です。 この時点で、ユーザーは OAuth2 ID プロバイダーでサインインを完了するよう求められます。 たとえば、ユーザー名とパスワードを入力します。

Azure AD B2C では、ID プロバイダーからアクセス トークンを取得するために必要なクライアント ID、スコープ、リダイレクト URI、その他のパラメーターを指定することで、認可要求を作成します。 このセクションでは、ID プロバイダーの /authorize エンドポイントに対する要求を構成できるようにする、承認エンドポイント メタデータについて説明します。

承認エンドポイントへの要求は常に HTTP GET です。 次の例は、承認エンドポイントの呼び出しを示しています。

GET https://login.contoso.com/oauth/v2/authorization?
client_id=12345
&response_type=code
&response_mode=query
&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob
&scope=profile%20offline_access
&redirect_uri=https%3a%2f%2fabrikam.b2clogin.com%2fabrikam.onmicrosoft.com%2foauth2%2fauthresp
&state=...

次の表に、承認エンドポイント メタデータを示します。

属性 必須 説明
authorization_endpoint はい RFC 6749 に準拠した承認エンドポイントの URL。
client_id はい ID プロバイダーのアプリケーション識別子。
AdditionalRequestQueryParameters No 追加の要求クエリ パラメーター。 たとえば、追加のパラメーターを ID プロバイダーに送信する場合があります。 コンマ区切り記号を使用して、複数のパラメーターを列挙できます。
response_mode いいえ Azure AD B2C に結果を返信するために、ID プロバイダーが使用するメソッド。 指定できる値: queryform_post (既定)、または fragment
scope いいえ OAuth2 ID プロバイダーの仕様に従って定義される要求の範囲。 たとえば、openidprofileemail などです。
UsePolicyInRedirectUri いいえ リダイレクト URI を構築するときにポリシーを使用するかどうかを示します。 ID プロバイダーでアプリケーションを構成するときは、リダイレクト URI を指定する必要があります。 リダイレクト URI は Azure AD B2C を指します (https://{your-tenant-name}.b2clogin.com/{your-tenant-name}.onmicrosoft.com/oauth2/authresp)。 true を指定した場合は、使用するポリシーごとにリダイレクト URI を追加する必要があります。 (例: https://{your-tenant-name}.b2clogin.com/{your-tenant-name}.onmicrosoft.com/{policy-name}/oauth2/authresp)。

トークン エンドポイント メタデータ

ユーザーが ID プロバイダーの承認エンドポイントで認証を完了すると、認可 code を含む応答が Azure AD B2C に返されます。 Azure AD B2C では、POST 要求を ID プロバイダーの /token エンドポイントに送信することで、アクセス トークンの認可コードを引き換えます。 このセクションでは、ID プロバイダーの /token エンドポイントに対する要求を構成できるようにする、トークン エンドポイント メタデータについて説明します。

次の HTTP 要求は、ID プロバイダーのトークン エンドポイントへの Azure AD B2C 呼び出しを示しています。

POST https://contoso/oauth2/token 
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&client_id=12345&scope=profile offline_access&code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq... 

次の表に、トークン エンドポイント メタデータを示します。

属性 必須 説明
AccessTokenEndpoint はい トークン エンドポイントの URL。 たとえば、「 https://www.linkedin.com/oauth/v2/accessToken 」のように入力します。
HttpBinding いいえ トークン エンドポイントへの予想される HTTP バインディング。 指定できる値: GET または POST
AccessTokenResponseFormat いいえ アクセス トークン エンドポイント呼び出しの形式。 たとえば、Facebook では HTTP GET メソッドが必要ですが、アクセス トークン応答は JSON 形式です。 指定できる値: DefaultJsonJsonP
ExtraParamsInAccessTokenEndpointResponse いいえ AccessTokenEndpoint からの応答に、一部の ID プロバイダーにより返される可能性がある余分なパラメーターが存在します。 たとえば、AccessTokenEndpoint からの応答には、 のような余分なパラメーターがあります。これは、access_token を除けば、ClaimsEndpoint 要求クエリ文字列での必須パラメーターです。 複数のパラメーター名をエスケープし、コンマ ',' 区切り記号で区切るようにしてください。
token_endpoint_auth_method No Azure AD B2C からトークン エンドポイントに認証ヘッダーを送信する方法を指定します。 指定できる値は、client_secret_post (既定値)、client_secret_basic (パブリック プレビュー)、private_key_jwt (パブリック プレビュー) です。 詳細については、OpenID Connect クライアント認証に関するセクションをご覧ください。
token_signing_algorithm いいえ token_endpoint_auth_methodprivate_key_jwt に設定されている場合に使用する署名アルゴリズムを指定します。 指定できる値: RS256 (既定値) または RS512

HTTP バインド メソッドを構成する

既定では、トークン エンドポイントへの要求では HTTP POST が使用されます。

<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="HttpBinding">POST</Item>

次の HTTP 呼び出しは、HTTP POST 要求を使用したトークン エンドポイントの呼び出しを示しています。

POST /oauth2/token

client_id=abcd&client_secret=1234&redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fcontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code

/token エンドポイントで HTTP GET メソッドを使用する必要がある ID プロバイダーでは、HttpBinding メタデータを GET に設定します。 次の例では、トークン エンドポイントによって JSON 形式で応答が返されるので、AccessTokenResponseFormatjson に設定されています。

<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="HttpBinding">GET</Item>
<Item Key="AccessTokenResponseFormat">json</Item>
GET /oauth2/token?client_id=abcd&client_secret=1234&redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fcontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code

アクセス トークン応答の形式を構成する

HTTP POST メソッドをサポートする ID プロバイダーでは、AccessTokenResponseFormat は既定で json に設定されます。 ID プロバイダーで HTTP GET 要求がサポートされる場合は、アクセス トークン応答の形式を明示的に json に設定する必要があります。

<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="HttpBinding">GET</Item>
<Item Key="AccessTokenResponseFormat">json</Item>

次の例は、JSON 形式のトークン エンドポイント応答を示しています。

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...",
    "token_type": "Bearer",
    "not_before": 1637924390,
    "expires_in": 960000,
}

認証方法を構成する

トークン エンドポイントへの要求には常に認証が必要です。 既定では、Azure AD B2C によってクライアント資格情報が ID プロバイダーに提供されます。 既定では、認証方法は、要求本文内のクライアントの資格情報 (client_id および client_secret) を含む client_secret_post です。

トークン エンドポイントに対する次の HTTP 要求には、POST データの client_idclient_secret が含まれています。 GET 要求では、client_idclient_secret がクエリ文字列パラメーターに含まれます。

POST /oauth2/token

client_id=abcd&client_secret=1234&redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fcontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code

/token エンドポイントで HTTP 基本認証を使用する必要がある ID プロバイダーの場合は、token_endpoint_auth_method メタデータを client_secret_basic に構成します。 この種類の認証方法では、クライアントの資格情報は、HTTP 基本認証スキームを使用して ID プロバイダーに渡されます。

<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="token_endpoint_auth_method">client_secret_basic</Item>

次の HTTP 要求は、HTTP 基本認証を使用したトークン エンドポイントの呼び出しを示しています。 Authorization ヘッダーには、base64 でエンコードされた client_ID:client_secret 形式のクライアント ID とクライアント シークレットが含まれています。

POST /oauth2/token

Authorization: Basic YWJjZDoxMjM0

redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code

秘密キー JWT 認証をサポートする ID プロバイダーでは、token_endpoint_auth_method メタデータを private_key_jwt に構成します。 この種類の認証方法では、Azure AD B2C に提供された証明書を使用して、署名付きアサーションが生成されます。これは、client_assertion パラメーターを使用して ID プロバイダーに渡されます。 client_assertion_typeurn:ietf:params:oauth:client-assertion-type:jwt-bearer に設定されます。 token_signing_algorithm メタデータによって、JWT トークンの署名アルゴリズムが指定されます。

<Item Key="AccessTokenEndpoint">https://contoso.com/oauth2/token</Item>
<Item Key="token_endpoint_auth_method">client_secret_basic</Item>
<Item Key="token_signing_algorithm">RS256</Item>

次の HTTP 要求は、秘密キー JWT 認証を使用したトークン エンドポイントの呼び出しを示しています。

POST /oauth2/token

client_assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6IjJFRFg0dWRYeDIxbXNoaXdJVzczMUY3OUZSbFJiUDZXVXJyZmktR1RFeVkifQ.eyJpc3MiOiJhYmNkIiwiZXhwIjoxNjM3OTI5ODY0LCJuYmYiOjE2Mzc5Mjk1NjQsImF1ZCI6Imh0dHBzOi8vNWRlNC0xMDktNjQtMTI0LTUzLm5ncm9rLmlvL2FjY2Vzc190b2tlbiIsImp0aSI6IjVxQWlGV2lEODNDbU1KWWNrejBRdGc9PSIsInN1YiI6ImFiY2QiLCJpYXQiOjE2Mzc5Mjk1NjR9.C4OtRnrLaQatpT5LP45O5Nb418S4v8yZi_C42ld440w&client_id=abcd&client_assertion_type=urn%3aietf%3aparams%3aoauth%3aclient-assertion-type%3ajwt-bearer&redirect_uri=https%3a%2f%2fcontoso.b2clogin.com%2fcontoso.onmicrosoft.com%2foauth2%2fauthresp&code=12345&grant_type=authorization_code

ユーザー情報エンドポイント メタデータ

Azure AD B2C では、OAuth2 ID プロバイダーからアクセス トークンを取得した後、ユーザー情報エンドポイントを呼び出します。 ユーザー情報エンドポイント (要求エンドポイントとも呼ばれます) は、認証されたユーザーに関する要求を取得するように設計されています。 Azure AD B2C では、ベアラー トークン認証を使用して、ID プロバイダーのユーザー情報エンドポイントに対する認証を行います。 ベアラー トークンは Azure AD B2C によって ID プロバイダー /token エンドポイントから取得されるアクセス トークンです。

ユーザー情報エンドポイントへの要求は常に HTTP GET です。 アクセス トークンは、access_token という名前のクエリ文字列パラメーターで送信されます。 次の HTTP 要求では、クエリ文字列パラメーターのアクセス トークンを使用して、ユーザー情報エンドポイントへの呼び出しを示しています。

GET /oauth2/claims?access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5... 

次の表に、ユーザー情報エンドポイント メタデータを示します。

属性 必須 説明
ClaimsEndpoint はい ユーザー情報エンドポイントの URL。 たとえば、「 https://api.linkedin.com/v2/me 」のように入力します。
ClaimsEndpointAccessTokenName いいえ アクセス トークンのクエリ文字列パラメーターの名前。 既定値: access_token
ClaimsEndpointFormatName いいえ 形式のクエリ文字列パラメーターの名前。 たとえば、LinkedIn 要求エンドポイント https://api.linkedin.com/v1/people/~?format=json では、名前を format として設定できます。
ClaimsEndpointFormat いいえ 形式のクエリ文字列パラメーターの値。 たとえば、LinkedIn 要求エンドポイント https://api.linkedin.com/v1/people/~?format=json では、値を json として設定できます。
BearerTokenTransmissionMethod いいえ トークンの送信方法を指定します。 既定の方法はクエリ文字列です。 トークンを要求ヘッダーとして送信するには、AuthorizationHeader に設定します。
ExtraParamsInClaimsEndpointRequest いいえ ClaimsEndpoint 要求に、一部の ID プロバイダーにより返される可能性がある余分なパラメーターが存在します。 複数のパラメーター名をエスケープし、コンマ ',' 区切り記号で区切るようにしてください。

アクセス トークンのクエリ文字列パラメーターを構成する

ユーザー情報エンドポイントでは、特定のクエリ文字列パラメーターでアクセス トークンを送信することが必要になる場合があります。 アクセス トークンを含むクエリ文字列パラメーターの名前を変更するには、ClaimsEndpointAccessTokenName メタデータを使用します。 次の例では、アクセス トークン クエリ文字列パラメーターが token に設定されています。

<Item Key="ClaimsEndpoint">https://contoso.com/oauth2/claims</Item>
<Item Key="ClaimsEndpointAccessTokenName">token</Item>

次の HTTP 呼び出しは、ClaimsEndpointAccessTokenNametoken に設定されたユーザー情報エンドポイントの呼び出しを示しています。

GET /oauth2/claims?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...

要求形式を構成する

ClaimsEndpointFormatName および ClaimsEndpointFormat を使用すると、キーと値のペアのクエリ文字列パラメーターをユーザー情報エンドポイントに送信できます。 次の例では、値 json を使用して、format という名前のクエリ文字列パラメーターを構成しています。

<Item Key="ClaimsEndpoint">https://contoso.com/oauth2/claims</Item>
<Item Key="ClaimsEndpointFormatName">format</Item>
<Item Key="ClaimsEndpointFormat">json</Item>

次の HTTP 要求は、ClaimsEndpointFormatNameClaimsEndpointFormat が構成されたユーザー情報エンドポイントの呼び出しを示しています。

GET /oauth2/claims?format=json&access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...

ベアラー トークンの送信方法を構成する

既定では、アクセス トークンは、クエリ文字列パラメーターを使用して ID プロバイダーのユーザー情報エンドポイントに送信されます。 HTTP Authorization ヘッダー内でトークンを送信するには、BearerTokenTransmissionMethod メタデータを AuthorizationHeader に設定します。

<Item Key="ClaimsEndpoint">https://contoso.com/oauth2/claims</Item>
<Item Key="BearerTokenTransmissionMethod">AuthorizationHeader</Item>

次の HTTP 要求は、BearerTokenTransmissionMethodAuthorizationHeader に設定されている場合にアクセス トークンがどのように渡されるかを示しています。

GET /oauth2/claims

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...

トークン エンドポイントによって返されるパラメーターを渡す

ID プロバイダーによっては、トークン エンドポイントから返される追加のパラメーターをユーザー情報エンドポイントに渡す必要があります。 たとえば、トークン エンドポイントからの応答には、resource という名前のパラメーターが含まれています。これは、ユーザー情報エンドポイント (アクセス トークン以外) の必須パラメーターです。 ExtraParamsInClaimsEndpointRequest メタデータを使用して、渡す追加パラメーターを指定します。 複数のパラメーター名をエスケープし、コンマ ',' 区切り記号で区切るようにしてください。

次の JSON は、resource という名前のパラメーターを持つトークン エンドポイントによって返される JSON ペイロードを示しています。

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...",
    "token_type": "Bearer",
    "not_before": 1549647431,
    "expires_in": 960000,
    "resource": "f2a76e08-93f2-4350-833c-965c02483b11"
}

resource パラメーターをユーザー情報エンドポイントに渡すには、次のメタデータを追加します。

<Item Key="ExtraParamsInClaimsEndpointRequest">resource</Item>

次の HTTP 要求は、resource パラメーターがユーザー情報エンドポイントに渡される方法を示しています。

GET /oauth2/claims?resource=f2a76e08-93f2-4350-833c-965c02483b11&access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5...

セッション エンドポイントを終了する

ユーザーをアプリケーションからサインアウトするには、ユーザーを Azure AD B2C サインアウト エンドポイントにリダイレクトする (OAuth2 と OpenID Connect の両方の場合) か、 を送信します (SAML の場合)。 Azure AD B2C によって、ブラウザーからユーザーのセッションがクリアされます。 サインアウト要求が発生すると Azure AD B2C では、ユーザーのサインインに使用されたフェデレーション ID プロバイダーからのサインアウトが試みられます。 OAuth2 ID プロバイダーのサインアウト URI は、end_session_endpoint メタデータで構成されます。 ユーザーが Azure AD B2C を使用してアプリケーションからログアウトすると、非表示の iframe が作成され、Azure AD B2C のサインアウト ページで end_session_endpoint が呼び出されます。

次の表に、ユーザー情報エンドポイント メタデータを示します。

属性 必須 説明
end_session_endpoint はい RFC 6749 に準拠したセッションの終了エンドポイントの URL。
SingleLogoutEnabled いいえ サインイン中に技術プロファイルがフェデレーション ID プロバイダーからサインアウトを試行しているかどうかを示します。 詳しくは、Azure AD B2C のセッション サインアウトに関する記事をご覧ください。指定できる値は (既定値) または false です。

OAuth2 汎用メタデータ

次の表に、OAuth2 ID プロバイダーの汎用メタデータを示します。 メタデータでは、OAuth2 の技術プロファイルによってトークンの検証の処理、要求の取得、エラー メッセージへの応答を行う方法を記述します。

属性 必須 説明
IdTokenAudience いいえ id_token の対象ユーザー。 指定される場合、Azure AD B2C は、トークンが ID プロバイダーにより返された要求内にあり、そして指定されたものと等しいかどうかをチェックします。
ProviderName いいえ ID プロバイダーの名前。
ResponseErrorCodeParamName いいえ HTTP 200 (Ok) 経由で返されるエラー メッセージを収納するパラメーターの名前。
IncludeClaimResolvingInClaimsHandling   いいえ 入力と出力の要求について、要求の解決を技術プロファイルに含めるかどうかを指定します。 指定できる値: true または false (既定値)。 技術プロファイルで要求リゾルバーを使用する場合は、これを true に設定します。
ResolveJsonPathsInJsonTokens いいえ 技術プロファイルが JSON パスを解決するかどうかを示します。 指定できる値: true または false (既定値)。 このメタデータを使用して、入れ子になった JSON 要素からデータを読み取ります。 OutputClaim で、 を、出力する JSON パス要素に設定します。 例: firstName.localized、または data.0.to.0.email

暗号化キー

CryptographicKeys 要素には次の属性が存在します。

属性 必須 説明
client_secret はい ID プロバイダー アプリケーションのクライアント シークレット。 response_types メタデータが に設定されている場合にのみ、暗号化キーが必要です。 この場合、Azure AD B2C は、アクセス トークンの認証コードを交換するために、別の呼び出しを行います。 メタデータが id_token に設定されている場合は、暗号化キーを省略できます。
assertion_signing_key No token_endpoint_auth_method メタデータが private_key_jwt に設定されている場合は、JWT キーの署名に使用する X509 証明書を指定します。 このキーは、OAuth2 ID プロバイダーによって提供される必要があります。

リダイレクト URI

ID プロバイダーのリダイレクト URI を構成する場合は、https://{tenant-name}.b2clogin.com/{tenant-name}.onmicrosoft.com/oauth2/authresp を入力します。 {tenant-name} は、必ず実際のテナントの名前 (たとえば、contosob2c) に置き換えてください。 リダイレクト URI は、すべて小文字である必要があります。

次の手順