我正在开发一个网站,要求用户必须登录才能使用该系统。当前功能为:当用户输入用户名和密码时,将在数据库中进行检查以检查该用户是否存在以及是否输入了正确的密码。然后才允许该用户登录。
到现在为止还不错,现在客户端希望向日志记录功能添加更多功能,即客户端只希望该用户存在一个会话。
IE。如果user1是从PC的一个浏览器登录的,则不应允许他从另一个系统或同一PC的另一个浏览器登录。
我怎么做?我打算使用数据库中的一个位字段来执行此操作,该字段将在用户第一次登录时设置。如果他尝试第二次登录,请检查该字段,并仅在未设置位字段的情况下才允许登录。
但我认为这会引起问题,
1)如果用户错误地关闭浏览器的选项卡并尝试再次登录,则他将无法登录,因为该位字段仍将在数据库中设置
2)如果用户错误地关闭浏览器,何时清除设置字段?
如果还有其他方法可以实现,那么您可以随意向我指出正确的方向。
正如一些其他成员指出的那样,该问题重复存在,但是这些问题并不是我真正想要的they are using form based authentication and I am not。
they are using form based authentication and I am not
这就是我通过所提供的链接设法做到这一点的方法@Satinder singh。
@Satinder singh
Global.asax.cs
protected void Application_Start(object sender, EventArgs e) { Application["UsersLoggedIn"] = new System.Collections.Generic.List<string>(); } protected 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); } } } }
Login.aspx.cs
protected bool Login(string userId) { System.Collections.Generic.List<string> d = Application["UsersLoggedIn"] as System.Collections.Generic.List<string>; if (d != null) { lock (d) { if (d.Contains(userId)) { // User is already logged in!!! string userLoggedIn = Session["UserLoggedIn"] == null ? string.Empty : (string)Session["UserLoggedIn"]; if (userLoggedIn == user_id) { Session["UserLoggedIn"] = user_id; return true; } else { return false; } } else { string userLoggedIn = Session["UserLoggedIn"] == null ? string.Empty : (string)Session["UserLoggedIn"]; if (userLoggedIn != user_id) { d.Add(userId); } } } } Session["UserLoggedIn"] = userId; return true; }
使用上面的代码,我允许任何用户在任何时间只能登录一次。我使用了会话变量来检查请求是否来自同一浏览器,如果是,我允许他/她登录,否则抛出一条消息“您已经从另一个系统登录”。