C# 在ASP.NET中每个用户仅限制一个会话

C# 在ASP.NET中每个用户仅限制一个会话,c#,.net,asp.net,C#,.net,Asp.net,如果用户登录时已经有另一个会话使用相同的用户名,是否还可以检测该用户登录,并阻止他再次登录或向他发送消息?我已经实现了这一点,当用户登录时,它会在数据库中设置一个他们已登录的标志。这是一个整数,表示他们登录的次数。我们允许两个。然后,在验证用户时只需检查它。您可以将用户的会话ID存储在数据库中。在每次登录时,将唯一用户名和SessionID的组合存储到数据库中。在母版页中,您包括对数据库的查询,以检查当前使用的用户名的上次登录是否来自同一会话。如果没有,则放弃会话并重定向到登录页面 我发布的行为

如果用户登录时已经有另一个会话使用相同的用户名,是否还可以检测该用户登录,并阻止他再次登录或向他发送消息?

我已经实现了这一点,当用户登录时,它会在数据库中设置一个他们已登录的标志。这是一个整数,表示他们登录的次数。我们允许两个。然后,在验证用户时只需检查它。

您可以将用户的会话ID存储在数据库中。在每次登录时,将唯一用户名和SessionID的组合存储到数据库中。在母版页中,您包括对数据库的查询,以检查当前使用的用户名的上次登录是否来自同一会话。如果没有,则放弃会话并重定向到登录页面


我发布的行为应该让第二个用户注销。您可以更改会话。放弃您想要的行为

您可以通过跟踪登录的用户,使用应用程序对象在您的global.asax中

在会话启动方法或登录方法中,可以检查用户是否存储在应用程序对象中


在会话结束方法或注销方法中,您需要将用户从应用程序对象中删除。

如果无法识别用户注销事件,请不要将其存储在数据库中(他们可能会单击注销、关闭选项卡、关闭整个浏览器或关闭计算机……)。
使用会话执行相同的检查

您始终可以在global.asax中实现事件

实现应用程序_Start()以设置System.Collections.Dictionary(或根据您的喜好),并将其存储在应用程序[]集合中,当用户登录时,添加用户名。从会话_End()中的集合中删除。请记住在处理集合时使用“lock”关键字:)

玩得开心

例如:

[page.aspx]
public partial class page : System.Web.UI.Page {
    protected bool Login(string userName) {
        System.Collections.Generic.List<string> d = Application["UsersLoggedIn"]
            as System.Collections.Generic.List<string>;
        if (d != null) {
            lock (d) {
                if (d.Contains(userName)) {
                    // User is already logged in!!!
                    return false;
                }
                d.Add(userName);
            }
        }
        Session["UserLoggedIn"] = userName;
        return true;
    }

    protected void Logout() {
        Session.Abandon();
    }
}

[global.asax]
<%@ Application Language="C#" %>
<script RunAt="server">
    void Application_Start(object sender, EventArgs e) {
        Application["UsersLoggedIn"] = new System.Collections.Generic.List<string>();
    }

    void Session_End(object sender, EventArgs e) {
        // NOTE: you might want to call this from the .Logout() method - aswell -, to speed things up
        string userLoggedIn = Session["UserLoggedIn"] == null ? string.Empty ? (string)Session["UserLoggedIn"];
        if (userLoggedIn.Length > 0) {
            System.Collections.Generic.List<string> d = Application["UsersLoggedIn"] 
                as System.Collections.Generic.List<string>;
            if (d != null) {
                lock (d) {
                    d.Remove(userLoggedIn);
                }
            }
        }
    }
</script>   
[page.aspx]
公共部分类页面:System.Web.UI.page{
受保护的bool登录(字符串用户名){
System.Collections.Generic.List d=应用程序[“UsersLoggedIn”]
as System.Collections.Generic.List;
如果(d!=null){
锁(d){
如果(d.Contains(用户名)){
//用户已登录!!!
返回false;
}
d、 添加(用户名);
}
}
会话[“UserLoggedIn”]=用户名;
返回true;
}
受保护的无效注销(){
会话。放弃();
}
}
[global.asax]
无效应用程序\u启动(对象发送方,事件参数e){
Application[“UsersLoggedIn”]=new System.Collections.Generic.List();
}
无效会话\u结束(对象发送方,事件参数e){
//注意:您可能还想从.Logout()方法调用它,以加快速度
字符串userLoggedIn=Session[“userLoggedIn”]==null?string.Empty?(string)Session[“userLoggedIn”];
如果(userLoggedIn.Length>0){
System.Collections.Generic.List d=应用程序[“UsersLoggedIn”]
as System.Collections.Generic.List;
如果(d!=null){
锁(d){
d、 删除(userLoggedIn);
}
}
}
}

如何确定用户是否注销?还有一些连接超时。因此,您至少需要在某个地方运行一个例程,以减少出现问题的整数。我相信我们的javascript运行与会话超时一致,它会询问您是否希望保持登录,如果没有回答,则会减少计数。在会话结束事件中也有相同的内容。我们还有一个在午夜重置计数为0的工作。看看这篇文章:我尝试过这个解决方案,但是我不能访问SeSSeXyEnter上的应用程序,因为我的HTTPSPACTION.WEATE是NULL。如何访问它?我尝试了此解决方案,但无法在会话结束时访问应用程序,因为我的HttpContext.Current为null。我如何访问它?@FredrikJohansson:如果用户在没有单击“注销”的情况下关闭浏览器,然后再次尝试使用相同的用户名登录,那么用户将无法登录。我们如何解决这个问题?@Kushal这是一个非常旧的代码,但我会在“//用户已经登录!!!”to do“Session[“UserLoggedIn”]=userName;return true;“-这应该可以解决问题。@FredrikJohansson按照您上面的评论进行操作将允许多个会话,这不是我们想要的。代码中的一切都很好唯一的问题是当浏览器关闭时,该用户的会话应该被清除。目前我已经使用了,但在会话过期和用户重新登录之前,我必须等待1分钟。@Kushal啊,我明白了,这就是代码的全部要点:)我想你也可以保存IP吗?用户登录到UsersLoggedIn集合(将其设置为集合或其他),如果匹配,允许再次登录?或者加上一些俏皮话