如何防止用户重复登录

时间:2011-04-19 09:58:56

标签: asp.net forms-authentication

在我的应用程序中,我不希望两个用户使用相同的登录名登录。

例如,user1登录名为“test1”,然后user2尝试使用“test1”登录,但此时user1的形式认证不会过期,因此应拒绝user2的登录。

我创建了一个缓存类来记录所有活动会话:

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。

有什么想法改进我的代码吗?或任何其他想法来实现我的要求?

我只是不希望用户重复登录(使用相同名称)。

更新

顺便说一句,我认为我的代码也有一些问题:我使用Session存储登录令牌,但是如果形式认证有超时但会话没有?

2 个答案:

答案 0 :(得分:3)

如果您使用会员提供者:

  

如果当前日期和时间减去UserIsOnlineTimeWindow属性值早于用户的LastActivityDate,则认为用户在线。

来自MSDN Article

所以你可以简单地使用支票

Membership.IsOnline();

在您登录用户之前。

答案 1 :(得分:0)

In asp.net site how to prevent multiple logins of same user 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;
  }