サインアウト¶
IdentityServerのサインアウトは、認証Cookieを削除するだけの簡単な方法ですが、完全なフェデレーションによるサインアウトを行うには、クライアントアプリケーション(さらにアップストリームのアイデンティティプロバイダ)にもユーザーを署名することを検討する必要があります。
認証Cookieを削除する¶
認証Cookieを削除するには、SignOutAsync拡張機能を使用しHttpContextます。使用したスキームを渡す必要があります(IdentityServerConstants.DefaultCookieAuthenticationScheme変更しない限り提供されます)。
await HttpContext.SignOutAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme);
または、IdentityServerによって提供される便利な拡張メソッドを使用することもできます。
await HttpContext.SignOutAsync();
注釈
通常、ログアウトページ(ユーザーが自動的にログアウトする)にアタッカーがホットリンクすることがあります。
ユーザーがログアウトしたことをクライアントに通知する¶
サインアウトプロセスの一環として、ユーザーがログアウトしたことをクライアントアプリケーションに通知する必要があります。IdentityServerは、サーバー側クライアント(MVCなど)、サーバー側クライアント(MVCなど)のバックチャネル仕様、ブラウザベースのJavaScriptクライアント(たとえばSPA、React、Angular など)のセッション管理仕様のフロントチャネル仕様をサポートしています、など)。
フロントチャネルサーバー側クライアント
Front-channel仕様でサーバー側クライアントアプリケーションから<iframe>ユーザーをサインアウトするには、IdentityServerの「ログアウト」ページで、ユーザーがログアウトしたことをクライアントに通知する必要があります。通知を受けたいクライアントは、FrontChannelLogoutUri設定値を設定する必要があります。IdentityServerは、ユーザーがログインしたクライアントを追跡GetLogoutContextAsyncし、IIdentityServerInteractionService(詳細)で呼び出されたAPIを提供します。このAPIは、ログアウトしたページがプロパティにレンダリングする必要LogoutRequestがあるSignOutIFrameUrlプロパティを持つオブジェクトを返します<iframe>。
バックチャネルサーバー側のクライアント
バックチャネル仕様を使用してサーバー側のクライアントアプリケーションからユーザーをサインアウトするにはSignOutIFrameUrl、IdentityServer のエンドポイントが自動的にサーバー間の呼び出しをトリガーし、署名済みのサインアウト要求をクライアントに渡します。つまり、フロントチャネルクライアントがなくても、IdentityServerの「ログアウト」ページで<iframe>はSignOutIFrameUrl、前述のように「to 」をレンダリングする必要があります。通知を受けたいクライアントは、BackChannelLogoutUri設定値を設定する必要があります。
ブラウザベースのJavaScriptクライアント
セッション管理仕様がどのように設計されているかを考えると、これらのクライアントにユーザーがログアウトしたことを通知するために必要なことは、IdentityServerでは特別なことは何もありません。ただし、クライアントはcheck_session_iframeで監視を実行する必要があり、これはoidc-client JavaScriptライブラリによって実装されます。
クライアントアプリケーションによって開始サインアウト¶
ログアウトがクライアントアプリケーションによって開始された場合、クライアントは最初にエンドセッションエンドポイントにユーザーをリダイレクトしました。エンドセッションエンドポイントでの処理では、ログアウトページへのリダイレクトを介していくつかの一時的な状態(たとえば、クライアントのポストログアウトリダイレクトuri)が維持される必要があります。この状態はログアウトページで使用することができ、状態の識別子はlogoutIdパラメータを介してログアウトページに渡されます。
インタラクションサービスのGetLogoutContextAsyncAPIを使用して状態をロードできます。theに興味があるのは、ログアウトの要求が認証されたかどうかを示します。したがって、ユーザーにログアウトを促さないのは安全です。ShowSignoutPromptShowSignoutPrompt
デフォルトでは、この状態はlogoutId値を介して渡される保護されたデータ構造として管理されます。エンド・セッション・エンドポイントとログアウト・ページの間で他の永続性を使用する場合はIMessageStore<LogoutMessage>、DIで実装を実装して登録できます。