3

集中認証サーバー (CAS) を使用してシングル サインオンを行うアプリケーションがあります。ユーザーが 1 つのアプリケーション (フロントエンド ポータルなど) からログアウトすると、同じシングル サインオン チケットを使用してすべてのアプリケーションからユーザーが自動的にサインアウトされるように、シングル サインアウトを実行したいと考えています。

各アプリケーションは、そのアプリケーションへのログオン時にサインアウト フック (URL) を CAS に登録することが期待されます。CAS は、いずれかのアプリケーションからサインアウト要求を受信すると、SSO チケットを共有するすべてのアプリケーションに対してサインアウト フックを呼び出します。

私の質問はこれです: 別のセッションから InProc セッションを放棄する方法はありますか? HTTP 要求は CAS サーバーから送信されるため、独自のセッションを取得すると思いますが、終了したいのはユーザーのセッションです。別のセッション状態サーバーを使用してこれを行う方法についてはかなり良い考えがありますが、InProc セッション状態を使用してそれが可能かどうか知りたいです。

4

4 に答える 4

3

はは、そうですね… できるようですね。これを行う方法があるかどうか疑問に思っていましたが、あることがわかりました。

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 イベントは引き続き取得されます。

于 2009-05-19T13:17:39.297 に答える
2

少し掘り下げて、これまでに提供された回答を検討した後、InProc セッションを引き続き使用できる代替手段を思いつきました。基本的には、既にシングル サインオンを処理している HttpModule を、検出された CAS サインアウトに拡張し、ブラウザーをアプリケーションのサインアウト ページにリダイレクトすることで構成されます。

概要:

入社する:

  1. 新しいシングル サインオン リクエストごとに、新しい SSO Cookie を作成し、一意の値をエンコードしてセッションを識別します (セッション ID ではないため、漏洩しません)。
  2. 識別子でエンコードされたサインアウト コールバック URL を作成し、CAS サーバーに登録します。

サインアウト:

  1. CAS サーバーからサインアウト要求を受信したら、識別子をデコードし、アプリケーション全体のキャッシュに格納します。これは、少なくともセッションが自然に期限切れになるのに十分な時間、キャッシュに固定する必要があります。
  2. リクエストごとに SSO Cookie を探し、その値をキャッシュされたサインアウト済みのセッション ID と照合します。ヒットした場合は、SSO Cookie を削除し、ブラウザーをアプリケーションのサインアウト URL にリダイレクトします。
  3. サインアウトごとに、SSO Cookie があるかどうかを確認し、存在する場合は、サインアウト要求を CAS に転送します。いずれにせよ、ユーザーのセッションを放棄し、アプリケーションからサインアウトしてください。

Page_Load:

  1. SSO Cookie の存在を確認します。ない場合は、サインアウト ページにリダイレクトします。
于 2008-11-03T04:10:24.650 に答える
1

InProc SessionStateを使用すると、データにアクセスできなくなります... StateServerを使用すると、セッションを削除するために正しいAPIにアクセスしようとするスティッキーなシナリオが発生します。

ほとんどの場合、事前にパッケージ化されたSqlServer状態プロバイダーのようなデータベースに裏打ちされた状態ソリューションまたはDOTSSのようなサードパーティソリューションを使用することをお勧めします:http: //codeplex.com/dotss

データベースに裏打ちされたソリューションを使用すると、セッションIDでテーブル内の状態レコードを検索し、完了としてマークすることができます。これらの手法は、選択したプロバイダーによって異なります。

于 2008-11-03T03:24:44.100 に答える
1

できません。

http://forums.asp.net/p/416094/416094.aspx#416094

于 2008-11-03T03:18:38.840 に答える