既存のSessionオブジェクトを反復処理する
-
06-07-2019 - |
質問
複数のユーザーが同じログインを使用するのを防ぐために、誰かがログインするときに同じユーザー名の既存のセッションを強制終了できるようにします。
既存のセッションを反復処理して強制終了する方法はありますか?
解決
これをglobal.asaxに追加
protected void Application_Start(object sender, EventArgs e)
{
Application["sessions"] = new List<HttpSessionState>();
}
protected void Session_Start(object sender, EventArgs e)
{
var sessions = (List<HttpSessionState>)Application["sessions"];
sessions.Add(this.Session);
}
protected void Session_End(object sender, EventArgs e)
{
var sessions = (List<HttpSessionState>)Application["sessions"];
sessions.Remove(this.Session);
}
これで、このようにセッションを繰り返すことができます
var sessions = (List<HttpSessionState>)Application["sessions"];
foreach (var session in sessions)
...
他のセッションを強制終了するには、古いセッションの Session_Start
メソッドをチェックインします。それはこのように見えるかもしれません。
protected void Session_Start(object sender, EventArgs e)
{
var userId = (int)this.Session["userId"];
foreach (var session in sessions)
if ((int)session["userId"] == userId)
session.Abandon();
var sessions = (List<HttpSessionState>)Application["sessions"];
sessions.Add(this.Session);
}
他のヒント
ログに記録されたユーザーをデータベースに保存し、すでにログインしているかどうかを確認できます。再度ログインできないようにすることができます。 Global.asaxでSession_Startメソッドを使用します。
簡単な答え:いいえ。
長答:独自のセッションプロバイダーを実装する必要があります。セキュリティ上の理由から、あるセッションが他のセッションを参照する方法はありません。周りを回って、独自のセッション管理を実装する必要があります。
これを実装したとき、ユーザー変数(または一意の何か)をアプリケーション変数、辞書、または配列に保存しました。ログイン時に、アプリケーションディクショナリのユーザーIDの存在を簡単に確認できます。唯一の本当の問題は、ログアウトせずにブラウザを閉じるだけです。このイベントを検出するための優れた信頼できる方法は決して見つかりません。
袖口から:
Session_Start(通常はログイン成功)で、ユーザーのUserIDとSessionIDをルックアップテーブル(またはユーザーテーブルの新しい列)に保存します。
各リクエストで、UserID(Sessionに格納されている)とSessionIDが認証ステップとしてLookupテーブルに格納されている値と一致することを検証する必要があります。