AD FS を使用した OpenID Connect の単一ログアウト
概要
Windows Server 2012 R2 の AD FS の初期 Oauth サポートに基づいて、AD FS 2016 では OpenId Connect サインオンのサポートが導入されました。 KB4038801では、AD FS 2016 で OpenId Connect シナリオのシングル ログアウトがサポートされるようになりました。 この記事では、OpenId Connect シナリオの単一ログアウトの概要と、AD FS で OpenId Connect アプリケーションに使用する方法に関するガイダンスを提供します。
ディスカバリードキュメント
OpenID Connect では、"探索ドキュメント" と呼ばれる JSON ドキュメントを使用して、構成の詳細を提供します。 これには、認証、トークン、userinfo、およびパブリック エンドポイントの URI が含まれます。 探索ドキュメントの例を次に示します。
{
"issuer":"https://fs.fabidentity.com/adfs",
"authorization_endpoint":"https://fs.fabidentity.com/adfs/oauth2/authorize/",
"token_endpoint":"https://fs.fabidentity.com/adfs/oauth2/token/",
"jwks_uri":"https://fs.fabidentity.com/adfs/discovery/keys",
"token_endpoint_auth_methods_supported":["client_secret_post","client_secret_basic","private_key_jwt","windows_client_authentication"],
"response_types_supported":["code","id_token","code id_token","id_token token","code token","code id_token token"],
"response_modes_supported":["query","fragment","form_post"],
"grant_types_supported":["authorization_code","refresh_token","client_credentials","urn:ietf:params:oauth:grant-type:jwt-bearer","implicit","password","srv_challenge"],
"subject_types_supported":["pairwise"],
"scopes_supported":["allatclaims","email","user_impersonation","logon_cert","aza","profile","vpn_cert","winhello_cert","openid"],
"id_token_signing_alg_values_supported":["RS256"],
"token_endpoint_auth_signing_alg_values_supported":["RS256"],
"access_token_issuer":"http://fs.fabidentity.com/adfs/services/trust",
"claims_supported":["aud","iss","iat","exp","auth_time","nonce","at_hash","c_hash","sub","upn","unique_name","pwd_url","pwd_exp","sid"],
"microsoft_multi_refresh_token":true,
"userinfo_endpoint":"https://fs.fabidentity.com/adfs/userinfo",
"capabilities":[],
"end_session_endpoint":"https://fs.fabidentity.com/adfs/oauth2/logout",
"as_access_token_token_binding_supported":true,
"as_refresh_token_token_binding_supported":true,
"resource_access_token_token_binding_supported":true,
"op_id_token_token_binding_supported":true,
"rp_id_token_token_binding_supported":true,
"frontchannel_logout_supported":true,
"frontchannel_logout_session_supported":true
}
検出ドキュメントでは、次の追加値を使用して、フロント チャネル ログアウトのサポートを示します。
- frontchannel_logout_supported: 値は 'true' になります
- frontchannel_logout_session_supported: 値は 'true' になります。
- end_session_endpoint: これは、クライアントがサーバーでのログアウトを開始するために使用できる OAuth ログアウト URI です。
AD FS サーバーの構成
AD FS プロパティ EnableOAuthLogout は既定で有効になります。 このプロパティは、クライアントでログアウトを開始する SID を持つ URL (LogoutURI) を参照するように AD FS サーバーに指示します。 KB4038801 がインストールされていない場合は、次の PowerShell コマンドを使用できます。
Set-ADFSProperties -EnableOAuthLogout $true
手記
EnableOAuthLogout
パラメーターは、KB4038801をインストールした後、古いものとしてマークされます。 EnableOAUthLogout
は常に true になり、ログアウト機能には影響しません。
手記
frontchannel_logout は、KB4038801 のインストール後にのみサポートされます
クライアント構成
クライアントは、ログインしているユーザーを "ログオフ" する URL を実装する必要があります。 管理者は、次の PowerShell コマンドレットを使用して、クライアント構成で LogoutUri を構成できます。
(Add | Set)-AdfsNativeApplication
(Add | Set)-AdfsServerApplication
(Add | Set)-AdfsClient
Set-AdfsClient -LogoutUri <url>
LogoutUri
は、AF FS がユーザーを "ログオフ" するために使用する URL です。 LogoutUri
を実装するには、クライアントがアプリケーション内のユーザーの認証状態を確実にクリアする必要があります(たとえば、クライアントが持っている認証トークンを削除するなど)。 AD FS は、SID をクエリ パラメーターとして使用して、その URL を参照し、証明書利用者/アプリケーションにユーザーのログオフを通知します。
- OAuth トークンとセッション ID: id_token トークン発行時に、AD FS は OAuth トークンにセッション ID を含めます。 これは後で AD FS によって使用され、ユーザーに対してクリーンアップされる関連する SSO Cookie を識別します。
- ユーザーが App1でログアウトを開始する: ユーザーは、ログインしているアプリケーションからログアウトを開始できます。 このシナリオ例では、ユーザーが App1 からログアウトを開始します。
- アプリケーション AD FSにログアウト要求を送信します。ユーザーがログアウトを開始した後、アプリケーションは AD FS のend_session_endpointに GET 要求を送信します。 アプリケーションは、必要に応じて、この要求のパラメーターとしてid_token_hintを含めることができます。 id_token_hintが存在する場合、AD FS はそれをセッション ID と組み合わせて使用して、ログアウト後にクライアントをリダイレクトする URI (post_logout_redirect_uri) を確認します。 post_logout_redirect_uriは、RedirectUris パラメーターを使用して AD FS に登録されている有効な URI である必要があります。
- AD FS は、ログインしているクライアントにサインアウトを送信します。AD FS はセッション識別子の値を使用して、ユーザーがログインしている関連するクライアントを検索します。 識別されたクライアントは、クライアント側でログアウトを開始するために、AD FS に登録されている LogoutUri に要求が送信されます。
FAQ
Q: 検出ドキュメントにfrontchannel_logout_supportedパラメーターとfrontchannel_logout_session_supportedパラメーターが表示されません。
A: すべての AD FS サーバーに KB4038801 がインストールされていることを確認します。 「KB4038801を使用した Server 2016 でのシングル ログアウト」を参照してください。
Q: ダイレクトとしてシングル ログアウトを構成しましたが、ユーザーは他のクライアントにログインしたままです。
A: ユーザーがログインしているすべてのクライアントに対して LogoutUri
が設定されていることを確認します。 また、AD FS は、登録された LogoutUri
でサインアウト要求を送信するベスト ケースの試行を行います。 クライアントは、要求を処理し、アプリケーションからユーザーをサインアウトするためのアクションを実行するロジックを実装する必要があります。
Q: ログアウト後、いずれかのクライアントが有効な更新トークンを使用して AD FS に戻った場合、AD FS はアクセス トークンを発行しますか?
A: はい。 登録された LogoutUri
でサインアウト要求を受信した後に、認証済みのすべての成果物を削除するのはクライアント アプリケーションの責任です。