如何防止用户重复登录

| 在我的应用程序中,我不希望两个用户使用相同的登录名登录。 例如,用户1以名称“ test1”登录,然后用户2也尝试以“ test1”登录,但是此时用户1的身份验证未过期,因此应拒绝用户2的登录。 我创建了一个缓存类来记录所有活动会话:
public class SessionDb {
    private static Dictionary<string, HttpSessionState> sessionDB=new Dictionary<string, HttpSessionState>();
public SessionDb() {
}

public static void addUserAndSession(string name, HttpSessionState session) {
    sessionDB.Add(name, session);
}

public static bool containUser(string name) {
    //in fact,here I also want to check if this session is active or not ,but I do not find the method like session.isActive() or session.HasExpire() or something else.
    return sessionDB.ContainsKey(name);
}

public static void removeUser(string name) {
    if(sessionDB.ContainsKey(name)) {
        sessionDB.Remove(name);
    }
}
} 在login.aspx.cs中: //检查名称和密码
if(checkNameAndPass(sUserName, sUserPwd)) {
    if(!SessionDb.containUser(sUserName)) {
        //let the user login
        Session[\"current_user_name\"] = sUserName;
        SessionDb.addUserAndSession(sUserName, Session);
        FormsAuthentication.RedirectFromLoginPage(UserName.Text, false);
    }
    else {
        //
        this.error.Text=string.Format(\"user {0} have logined!\", sUserName);
    }
}
Global.asax:
void Session_End(object sender, EventArgs e) 
{
    SessionDb.removeUser(Session[\"current_user_name\"].ToString());
}
但似乎根据sessionState中的超时设置,有时会调用Session_End()方法。 显然,我需要SessionDb在身份验证超时时删除相关会话。 有什么想法可以改善我的代码吗?或任何其他想法来实现我的要求? 我只是不希望用户重复登录(具有相同的名称)。 更新: 顺便说一句,我认为我的代码也有一些问题:我使用会话将日志存储在令牌中,但是如果表单身份验证有超时但会话没有呢?
已邀请:
如果您使用的是成员资格提供程序: 如果当前日期和时间减去UserIsOnlineTimeWindow属性值早于该用户的LastActivityDate,则该用户被视为联机。 从MSDN文章 所以你可以简单地使用支票
Membership.IsOnline();
在您登录用户之前。
在ASP.NET网站中,如何防止同一用户ID的多次登录? 另一种方法(免责声明:我尚未对此进行测试。): 在web.config中,将userIsOnlineTimeWindow添加为1,并在loggingIn事件处理程序中:
protected void Login1_LoggingIn(object sender, LoginCancelEventArgs e)
{
  MembershipUser u = Membership.GetUser(Login1.UserName);
  Response.Write(u.IsOnline);
  if (u.IsOnline)
  {
    Login1.FailureText = \"A user with this username is already logged in.\";
    e.Cancel = true;
  }

要回复问题请先登录注册