要求を行っているセッションとは異なるセッションからInProc ASP.NETセッションを放棄できますか?
-
06-07-2019 - |
質問
集中認証サーバー(CAS)を使用してシングルサインオンを行うアプリケーションがあります。ユーザーが1つのアプリケーション(フロントエンドポータルなど)からログアウトすると、ユーザーは同じシングルサインオンチケットを使用してすべてのアプリケーションから自動的にログアウトされるように、シングルサインアウトを行います。
各アプリケーションは、そのアプリケーションへのログオン時にCASにサインアウトフック(URL)を登録することが期待されます。 CASは、アプリケーションの1つからサインアウト要求を受信すると、SSOチケットを共有するすべてのアプリケーションのサインアウトフックを呼び出します。
私の質問はこれです:別のセッションからInProcセッションを放棄する方法はありますか? HTTP要求はCASサーバーから送信されるため、独自のセッションを取得することになると思いますが、終了するのはユーザーのセッションです。別のセッション状態サーバーを使用してこれを行う方法についてはかなり良い考えがありますが、InProcセッション状態を使用してそれが可能かどうかを知りたいです。
解決 2
少し掘り下げて、これまでに提供された回答を検討した後、InProcセッションを引き続き使用できる代替案を思いつきました。基本的に、シングルサインオンを既に処理しているHttpModuleを、検出されたCASサインアウトに拡張し、ブラウザーをアプリケーションサインアウトページにリダイレクトすることで構成されます。
概要:
サインオン:
- 新しいシングルサインオンリクエストごとに、新しいSSO Cookieを作成し、その中に一意の値をエンコードしてセッションを識別します(セッションIDではなく、漏えいしません)。
- 識別子でエンコードされたサインアウトコールバックURLを構築し、CASサーバーに登録します。
サインアウト:
- CASサーバーからサインアウト要求を受信したら、識別子をデコードし、アプリケーション全体のキャッシュに保存します。これは、少なくともセッションが自然に期限切れになるまでキャッシュに固定する必要があります。
- リクエストごとに、SSO Cookieを探し、キャッシュされたサインアウトされたセッション識別子に対してその値を確認します。ヒットした場合、SSO Cookieを削除し、ブラウザをアプリケーションのサインアウトURLにリダイレクトします。
- サインアウトごとに、SSO Cookieが存在するかどうかを確認し、存在する場合は、サインアウト要求をCASに転送します。いずれにしても、ユーザーのセッションを中止し、アプリケーションからログアウトします。
Page_Load:
- SSO Cookieの存在を確認します。ない場合は、サインアウトページにリダイレクトします。
他のヒント
ハハ、まあ...できるようです。これを行う方法はあるかと思いましたが、判明しました。
InProcを使用すると、InProcSessionStateStore(内部クラス)はセッションの状態を内部(非パブリック)キャッシュに保持します。リフレクションを介してこのキャッシュにアクセスし、セッション状態を手動で削除できます。
using System;
using System.Reflection;
using System.Web;
object obj = typeof(HttpRuntime).GetProperty("CacheInternal",
BindingFlags.NonPublic | BindingFlags.Static)
.GetValue(null, null);
if (obj != null)
{
MethodInfo remove = obj.GetType()
.GetMethod("Remove", BindingFlags.NonPublic | BindingFlags.Instance,
Type.DefaultBinder, new Type[] { typeof(string) }, null);
object proc = remove.Invoke(obj, new object[] { "j" + state.SessionID });
}
最終結果は、次のリクエストが同じSessionIDを取得することですが、HttpSessionStateは空になります。 Session_StartイベントとSession_Endイベントは引き続き取得されます。
InProc SessionStateを使用すると、データにアクセスできません... StateServerを使用すると、正しいAPIにアクセスしてセッションを削除しようとするスティッキーなシナリオが依然として存在します。
ほとんどの場合、事前にパッケージ化されたSqlServer状態プロバイダーなどのデータベースバックアップ状態ソリューションまたはDOTSSなどのサードパーティソリューションを使用する必要があります。 http://codeplex.com/dotss
データベースバックアップソリューションを使用すると、セッションIDでテーブル内の状態レコードを検索し、完了としてマークすることができます。これらの手法は、選択するプロバイダーによって異なります。