我希望能够在有人登录时使用相同的用户名终止现有会话,以防止多人使用相同的登录信息。
有没有办法迭代现有会话并杀死它们?
答案 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是否与查找表中存储的值匹配作为身份验证步骤。