2009-10-23 72 views
2

我想要在某人登錄時爲相同用戶名殺掉現有會話,以防止多人使用相同的登錄名。遍歷現有會話對象

有沒有辦法遍歷現有會話並殺死它們?

回答

2

添加到您的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); 
} 
0

您可以將登錄的用戶保存到數據庫並檢查他們是否已經登錄,您可以阻止他們再次登錄。使用Global.asax下的Session_Start方法。

0

簡答題:沒有。

長答案:您需要實現您自己的會話提供程序。出於安全原因,一個會話無法引用任何其他會話。你必須經過並實施你自己的會話管理。

0

有一次我實現了這個功能,我將用戶標識(或者唯一的東西)存儲在應用程序變量,字典或數組中。登錄時很容易檢查應用程序字典中是否存在用戶標識。唯一真正的問題是沒有註銷並關閉瀏覽器的用戶。你永遠找不到一個可靠的方法來檢測這個事件。

0

即興:

在在session_start(通常是一個成功的登錄),在商店中用戶的查找表的用戶ID和會話ID(或在user表中新列)。

對於每個請求,您需要驗證用戶ID(存儲在會話中)和SessionID與存儲在查找表中的值匹配,作爲身份驗證步驟。