AD FS での OpenID 接続のシングル ログアウト

概要

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 は既定で有効になります。 このプロパティは、AD FS サーバーに対してクライアントのログアウトを開始するため、SID を使用して URL (LogoutURI) を参照するように指示します。 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 を参照し、証明書利用者/アプリケーションにユーザーをログオフするよう信号を送ります。

AD FS log off user diagram

  1. セッション ID を持つ OAuth トークン: AD FS は、id_token トークンの発行時に OAuth トークンにセッション ID を付与します。 これは、後に AD FS で、ユーザーのためにクリーン アップされるべき、関連する SSO クッキーを識別するために使用されます。
  2. ユーザーが App1 でログアウトを開始する: ユーザーは、ログインしている任意のアプリケーションからログアウトを開始できます。 このシナリオ例では、ユーザーが App1 からログアウトを開始します。
  3. アプリケーションがログアウト要求を AD FSに送信する: ユーザーがログアウトを開始した後、アプリケーションは AD FS の end_session_endpoint に GET 要求を送信します。 アプリケーションでは、必要に応じてパラメーターとして、id_token_hint を要求に含めることができます。 id_token_hint が存在する場合、AD FS は、ログアウト後にクライアントがどの URI にリダイレクトされるべきかを判断するためにセッション ID と組み合わせて使用します (post_logout_redirect_uri)。 post_logout_redirect_uri は、RedirectUris パラメーターを使用して AD FS に登録された有効な URI である必要があります。
  4. 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: ログアウト後に、クライアントの 1 つが有効な更新トークンを持ち、AD FS に戻った場合、AD FS は、アクセス トークンを発行しますか?
A: はい。 登録された LogoutUri でサインアウト要求を受信した後に、認証済みのすべての成果物を削除するのはクライアント アプリケーションの責任です。

次の手順

AD FS の開発