迭代现有的Session对象

时间:2009-10-23 15:05:40

标签: asp.net asp.net-2.0 c#-2.0

我希望能够在有人登录时使用相同的用户名终止现有会话,以防止多人使用相同的登录信息。

有没有办法迭代现有会话并杀死它们?

5 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

您可以将记录的用户保存到数据库并检查他们是否已经登录,您可以阻止他们再次登录。使用Global.asax下的Session_Start方法。

答案 2 :(得分:0)

简答:不。

答案很长:您需要实现自己的会话提供程序。出于安全原因,一个会话无法引用任何其他会话。您必须四处寻找并实施自己的会话管理。

答案 3 :(得分:0)

有一次我实现了这个,我将用户ID(或其他东西)存储在Application变量,Dictionary或Array中。在登录时很容易检查应用程序字典中是否存在用户ID。唯一真正的问题是那些不注销并只关闭浏览器的人。你永远找不到一种可靠的方法来检测这个事件。

答案 4 :(得分:0)

脱下袖口:

在Session_Start(通常是成功登录)上,将用户的UserID和SessionID存储在查找表(或用户表中的新列)中。

在每个请求中,您需要验证UserID(存储在Session中)和SessionID是否与查找表中存储的值匹配作为身份验证步骤。