AD FS OpenID Connect/OAuth の概念
Active Directory フェデレーション サービス (AD FS) 2016 以降に適用されます
先進認証のアクター
Actor | 説明 |
---|---|
エンド ユーザー | リソースにアクセスするセキュリティ プリンシパル (ユーザー、アプリケーション、サービス、グループ)。 |
Client | クライアント ID によって識別される Web アプリケーション。 クライアントは通常、エンド ユーザーが対話するパーティであり、クライアントは承認サーバーからトークンを要求します。 |
承認サーバー/ID プロバイダー (IdP) | AD FS サーバー。 これは、組織のディレクトリに存在するセキュリティ プリンシパルの ID を確認する役割を担います。 セキュリティ プリンシパルが正常に認証されると、セキュリティ トークン (ベアラー アクセス トークン、ID トークン、更新トークン) が発行されます。 |
リソース サーバー/リソース プロバイダー/証明書利用者 | リソースまたはデータが存在する場所。 承認サーバーを信頼してクライアントを安全に認証および承認し、ベアラー アクセス トークンを使用してリソースへのアクセスを許可できるようにします。 |
次の図は、アクター間の最も基本的な関係を示しています。
アプリケーションの種類
アプリケーションの種類 | 説明 | Role |
---|---|---|
ネイティブ アプリケーション | "パブリック クライアント" と呼ばれることもあります。 PC またはデバイスで実行されるクライアント アプリとして使用することを目的としており、ユーザーが操作します。 | リソースへのユーザー アクセスのために、承認サーバー (AD FS) からのトークンを要求します。 トークンを HTTP ヘッダーとして使用して、保護されたリソースに HTTP 要求を送信します。 |
サーバー アプリケーション (Web アプリ) | サーバー上で実行され、ブラウザーを介してユーザーがアクセスできる Web アプリケーション。 独自のクライアント シークレットまたは資格情報を維持できるため、"機密クライアント" と呼ばれることもあります。 | リソースへのユーザー アクセスのために、承認サーバー (AD FS) からのトークンを要求します。 トークンを要求する前に、クライアント (Web アプリ) はそのシークレットを使って認証を行う必要があります。 |
Web API | ユーザーがアクセスするエンド リソース。 証明書利用者の新しい表現と考えることができます。 | クライアントによって取得されたベアラー アクセス トークンを使用します。 |
アプリケーション グループ
アプリケーション グループは、AD FS を使用して構成されているすべてのネイティブまたは Web アプリの OAuth クライアントまたは Web API リソースに関連付ける必要があります。 クライアントをアプリケーション グループに構成して、同じグループ内のリソースにアクセスするようにします。 アプリケーション グループには、複数のクライアントとリソースを含めることができます。
セキュリティ トークン
先進認証では、次のトークンの種類を使用します。
- id_token: 承認サーバー (AD FS) によって発行され、クライアントによって使用される JWT トークン。 ID トークン内のクレームには、クライアントが使用できるように、ユーザーに関する情報が含まれています。
- access_token: 承認サーバー (AD FS) によって発行され、リソースによって使用されることが意図されている JWT トークン。 このトークンの 'aud' つまり audience クレームは、リソースまたは Web API の識別子と一致している必要があります。
- refresh_token: クライアントが id_token と access_token を更新する必要があるときに使用するため、AD FS によって発行されます。 このトークンはクライアントに対して非透過的であり、AD FS によってのみ使用されます。
更新トークンの有効期間
- 単純なログオン、KMSI なし、デバイスが登録されて "いない": AD FS により
SsoLifetime
とDeviceUsageWindowInDays
が適用されます。 最初の更新トークンには、lifetime=DeviceUsageWindowInDays
またはSsoLifetime
が、どちらのフィールドが低いかに基づいて存在しますが、それ以上更新トークンは発行 "されません"。 - KMSI ログオン、AD FS 構成に
EnableKmsi=true
、kmsi=true
がパラメーターとして渡される: AD FS によりDeviceUsageWindowInDays
を使用してKmsiLifetimeMins
が適用されます。 最初の更新トークンにはlifetime=DeviceUsageWindowInDays
があり、後続のgrant_type=refresh_token
要求ごとに新しい更新トークンが取得されます。 このプロセスは、ネイティブ クライアントまたは機密クライアントとデバイス認証でのみ行われます。 - 登録済みデバイス、デバイス認証: AD FS では KMSI と同様に
PersistentSsoLifetimeMins
とDeviceUsageWindowInDays
が使用されます。 ネイティブ クライアントと機密クライアントの両方が、デバイス認証に基づいて新しい更新トークンを取得する必要があります。
詳しくは、AD FS のシングル サインオンに関するドキュメントをご覧ください。
スコープ
AD FS にリソースを登録するときに、AD FS が特定のアクションを実行できるようにスコープを構成できます。 スコープを構成すると共に、アクションを実行するには、AD FS の要求でスコープ値を送信する必要があります。 たとえば、管理者がリソースの登録時に openid
としてスコープを構成すると、アプリケーション (クライアント) は、AD FS が ID トークンを発行するために、認証要求で scope = openid
を送信する必要があります。 AD FS で使用可能なスコープの詳細を次に示します。
aza
- ブローカー クライアント用の OAuth 2.0 プロトコル拡張機能を使用し、スコープ パラメーターにスコープaza
が含まれている場合、サーバーは新しいプライマリ更新トークンを発行します。 応答のrefresh_token
フィールドにトークンが設定され、有効期間が適用されている場合は、refresh_token_expires_in field
を新しいプライマリ更新トークンの有効期間に設定します。openid
- アプリケーション要求でopenid
接続認証プロトコルを使用できるようにします。logon_cert
- 認証済みユーザーを対話形式でログオンさせるために使用できるサインイン証明書をアプリケーションで要求できるようにします。 AD FS サーバーは、応答からaccess_token
パラメーターを省略し、代わりに Base64 でエンコードされた CMS 証明書チェーンまたは CMC 完全 PKI 応答を提供します。 詳細については、MS-OAPX: OAuth 2.0 プロトコル拡張機能に関する記事を参照してください。user_impersonation
- AD FS から代理アクセス トークンを要求します。 このスコープの使用方法について詳しくは、「AD FS 2016 で OAuth を使用して、On-Behalf-Of (OBO) を使用する多層アプリケーションを構築する」をご覧ください。allatclaims
– アプリケーションがアクセス トークン内のクレームも ID トークンに追加するように要求できるようにします。vpn_cert
- アプリケーションで VPN 証明書を要求できるようにします。これにより、EAP-TLS 認証を使用して VPN 接続が確立されます。 この機能はサポートされなくなりました。email
- アプリケーションがサインインしたユーザーのメール クレームを要求できるようにします。profile
- アプリケーションがサインインしたユーザーのプロファイル関連のクレームを要求できるようにします。
クレーム
AD FS によって発行されたセキュリティ トークン (アクセス トークンと ID トークン) には、要求、つまり認証されたサブジェクトに関する情報のアサーションが含まれます。 アプリケーションは、次のようなさまざまなタスクの要求を使用できます。
- トークンを検証する
- サブジェクトのディレクトリ テナントを識別する
- ユーザー情報を表示する
- サブジェクトの承認を判断する
セキュリティ トークンに含まれる要求は、トークンの種類、ユーザーの認証に使用する資格情報の種類、アプリケーションの構成によって異なります。
大まかな AD FS 認証フロー
大まかなフローの図を次に示します。
AD FS がクライアントから認証要求を受信します。
AD FS は、AD FS でのクライアントとリソースの登録時に取得したクライアント ID を使用して、認証要求のクライアント ID を検証します。 機密クライアントを使用している場合、AD FS は、認証要求で提供されたクライアント シークレットも検証します。 AD FS は、クライアントのリダイレクト URI も検証します。
AD FS は、認証要求で渡された resource パラメーターを使用して、クライアントがアクセスする必要があるリソースを識別します。 MSAL クライアント ライブラリを使用している場合、resource パラメーターは送信されません。 代わりに、リソース URL がスコープ パラメーターの一部として送信されます: "scope = [リソース URL]/[openid などのスコープ値]"。
リソースが resource パラメーターまたは scope パラメーターを使用して渡されない場合、AD FS によって、MFA、発行、承認ポリシーなどのポリシーを構成できない既定のリソースである
urn:microsoft:userinfo
が使用されます。次に、AD FS は、クライアントがリソースにアクセスするためのアクセス許可を持っているかどうかを検証します。 また AD FS は、認証要求で渡されたスコープが、リソースの登録時に構成されたスコープと一致するかどうかを検証します。 クライアントにアクセス許可がない場合、または認証要求で適切なスコープが送信されていない場合、認証フローは終了します。
アクセス許可とスコープが検証されると、AD FS は構成された認証方法を使用してユーザーを認証します。
リソース ポリシーまたはグローバル認証ポリシーに従って別の認証方法が必要な場合、AD FS によって追加の認証がトリガーされます。
AD FS は、Microsoft Entra 多要素認証またはサード パーティの多要素認証を使用して認証を行います。
ユーザーが認証されると、AD FS によってクレーム規則が適用されます。 クレーム規則は、セキュリティ トークンの一部としてリソースに送信されるクレームを決定します。 AD FS はさらに、ユーザーがリソースにアクセスするために必要な条件を満たしていることを確認するアクセス制御ポリシーも適用します。
次に、AD FS によってアクセス トークンと更新トークンが生成されます。 AD FS では ID トークンも生成されます。
AD FS は認証要求を受け取ります。
認証要求に
scope = allatclaims
が含まれている場合、定義されたクレーム規則に基づいてアクセス トークンにクレームを含めるよう ID トークンがカスタマイズされます。必要なトークンが生成およびカスタマイズされると、AD FS は、クライアントに応答し、トークンを含めます。 ID トークン応答は、認証要求に
scope = openid
が含まれている場合にのみ応答に含まれます。 クライアントは、トークン エンドポイントを使用して、認証後にいつでも ID トークンを取得できます。
ライブラリの種類
AD FS で次の 2 種類のライブラリを使用します。
クライアント ライブラリ: ネイティブ クライアントとサーバー アプリでは、クライアント ライブラリを使用して、Web API などのリソースを呼び出すためのアクセス トークンを取得します。 Microsoft Authentication Library (MSAL) は、AD FS 2019 を使用する場合に推奨される最新のクライアント ライブラリです。
サーバー ミドルウェア ライブラリ:Web アプリは、ユーザーのサインインにサーバー ミドルウェア ライブラリを使用します。 Web API は、サーバー ミドルウェア ライブラリを使用して、ネイティブ クライアントまたは他のサーバーによって送信されるトークンを検証します。 推奨されるミドルウェア ライブラリは Open Web Interface for .NET (OWIN) です。
ID トークンをカスタマイズする (ID トークンの追加クレーム)
特定のシナリオでは、Web アプリ クライアンで機能を支援するために ID トークン内に追加のクレームが必要になる場合があります。 次のいずれかのオプションを使用して、ID トークンに追加のクレームを設定します。
オプション 1: このオプションは、パブリック クライアントがあり、アクセスしようとしているリソースが Web アプリにない場合に使用します。 このオプションには以下が必要です。
response_mode
は として設定されますform_post
- 証明書利用者の識別子 (Web API 識別子) がクライアント識別子と同じである
オプション 2: このオプションは、アクセスしようとしているリソースが Web アプリに存在し、ID トークンを介して追加のクレームを渡す必要がある場合に使用します。 パブリック クライアントと機密クライアントの両方を使用できます。 このオプションには以下が必要です。
response_mode
は として設定されますform_post
KB4019472 が AD FS サーバーにインストールされている
スコープ
allatclaims
がクライアント – RP ペアに割り当てられている。 このスコープを割り当てるにはGrant-ADFSApplicationPermission
を使用します。 既に 1 回付与されている場合は、Set-AdfsApplicationPermission
を使用します。 次の例では、PowerShell コマンドレットが示されています。Grant-AdfsApplicationPermission -ClientRoleIdentifier "https://my/privateclient" -ServerRoleIdentifier "https://rp/fedpassive" -ScopeNames "allatclaims","openid"
カスタマイズされた ID トークンを取得するように AD FS で Web アプリを構成する方法の詳細については、AD FS 2016 以降のカスタム ID トークンに関する記事を参照してください。
シングル ログアウト
シングル ログアウトにより、セッション ID を使用するすべてのクライアント セッションが終了します。 AD FS 2016 以降では、OpenID Connect/OAuth のシングル ログアウトがサポートされています。 詳細については、「AD FS での OpenID Connect のシングル ログアウト」を参照してください。
AD FS のエンドポイント
AD FS エンドポイント | 説明 |
---|---|
/authorize | AD FS は、アクセス トークンの取得に使用できる承認コードを返します。 |
/token | AD FS は、Web API の場合と同様に、リソースへのアクセスに使用できるアクセス トークンを返します。 |
/userinfo | AD FS はサブジェクト クレームを返します。 |
/devicecode | AD FS はデバイス コードとユーザー コードを返します。 |
/logout | AD FS によって、ユーザーがログアウトされます。 |
/keys | 応答の署名に使用される AD FS 公開キー。 |
/.well-known/openid-configuration | AD FS によって、OAuth/OpenID Connect のメタデータが返されます。 |