asp.net - 如何防止用户重复登录

标签 asp.net forms-authentication

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

例如,user1以名称“test1”登录,然后user2也尝试以“test1”登录,但此时user1的formauthentication没有过期,所以user2的登录应该被拒绝。

我创建了一个缓存类来记录所有的事件 session :

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);
    }
}

全局.asax:

void Session_End(object sender, EventArgs e) 
{
    SessionDb.removeUser(Session["current_user_name"].ToString());
}

但似乎根据 sessionState 中的超时设置,Session_End() 方法有时会被调用。

显然我需要 SessionDb 在身份验证超时时删除相关 session 。

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

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

更新:

顺便说一句,我认为我的代码也有一些问题:我使用 Session 存储登录 token ,但是如果 formauthentication 超时但 session 没有超时怎么办?

最佳答案

如果您使用的是成员(member)资格提供商:

A user is considered online if the current date and time minus the UserIsOnlineTimeWindow property value is earlier than the LastActivityDate for the user.

来自 MSDN Article

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

Membership.IsOnline();

在您登录用户之前。

关于asp.net - 如何防止用户重复登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5714645/

相关文章:

asp.net - 将附加参数传递给自定义成员(member)资格提供商的 ValidateUser()

asp.net - 我无法运行 ajax 示例

javascript - 为什么 SignalR 在收到所有更新之前发送调用的回调

ASP.NET:身份验证过期时如何获取 FormsAuthenticationTicket 对象

c# - Asp.net Mvc FormsAuth 与 Site.Master 中的 LogonUserControl

.net - IIS 7(和 MVC)中的表单例份验证 : Why ReturnUrl=/is added?

c# - 保存 ASP.net 网页的全局数据

javascript - 如何通过 JavaScript 使用引导选项卡激活提交表单的选项卡

asp.net - 如何使用sqlserver来存储 session 状态?

asp.net-mvc - 使用成员(member)提供程序进行 ASP.NET MVC 4 Web API 身份验证