删除用户在其他浏览器上删除后再次登录

本文关键字:删除 登录 浏览器 用户 其他 | 更新日期: 2023-09-27 17:54:48

var query = from p in AdminModelContext.Users
            where p.UserName == model.UserName && p.Password == encryptPassword 
            && p.IsDeleted == false
                                select p;
            IList<Users> userList = query.ToList();
if (userList.Count() > 0)
{
    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
    if (CheckUrl(returnUrl))
    {
        return Redirect(returnUrl);
    }
    SetRoleForUser(userList[0].RolesId);
    LoggerService.Info(string.Format("Login Successful for the user : {0}", 
        model.UserName));
    return RedirectToAction("Index", "Home");
}

我使用以下代码通过我的网站登录。我所面临的问题是,当我在特定浏览器上使用用户登录时,同时在不同的浏览器上使用不同的用户登录,然后我删除了该用户(在另一个浏览器上登录)。我仍然可以浏览已删除用户登录的页面。

我没有找到一个公平的解决方案,把认证逻辑在每一页。我的网站是在MVC模式和使用基于表单的身份验证。

请建议我如何将登录用户会话验证并实现此目标。

删除用户在其他浏览器上删除后再次登录

到目前为止,没有一个答案真正承认这个问题。

让我们看一下控制流程:

User A enters log in page, supplies valid credentials
User A is issued Ticket A.
User B enters site, supplies valid credentials.
User B is issued Ticket B.
User B then revokes User A's access CREDENTIALS.

此时票a没有发生任何事情,因为票独立于凭证。当票A过期时,他们将被要求出示他们的凭据,并且将无法登录。

所以你已经注意到,把一个活跃的用户踢出你的网站实际上是相当困难的。正如您已经意识到的那样,唯一的解决方案是对每个请求都具有身份验证逻辑。很不幸,那真的很重。

在我构建的登录系统中,我通过创建2个票证来处理这方面,1个票证存储在表单认证票证中,正常情况下有很长的持续时间,还有一个票证存储在HttpRuntime.Cache中,我将此票证的缓存过期时间设置为15分钟。

对于每个页面请求,我检查用户是否在缓存中有票据(基于他们的Forms Auth票据信息),此时如果他们没有票据,我执行用户数据刷新并轮询用户数据库。如果用户被挂起或删除,他们将被注销。

使用这种方法,我知道我的网站可以禁用一个用户,并在15分钟内该用户将被禁止访问网站。如果我想让它们立即被禁止,我可以循环应用配置来清除缓存并强制它发生。

通常,如果您为控制器或操作定义了[Authorize]属性,则每次回发时都会检查身份验证。

内置的MembershipProvider为您处理所有这些。但似乎您正在使用自己的用户数据库。然后,您必须实现自己的MembershipProvider, IPrincipalMembershipUser,并将其添加到您的Web中。配置替换默认配置

你可以在这里找到更多如何实现你自己的MembershipProvider: http://msdn.microsoft.com/en-us/library/f1kyba5e.aspx

我的建议是创建一个空的MVC项目,看看默认的身份验证机制。如果您使用新数据库构建新应用程序,请尝试使用默认身份验证。

在你自己的MembershipProvider中的validateUser函数可以是这样的:

public override bool ValidateUser(string username, string password)
{
    bool isValid = false;
    bool isApproved = false;
    string pwd = "";
    using (AdminModelContext db = new AdminModelContext())
    {
        var user = db.Users.FirstOrDefault(u => u.UserName == username);
        if (user != null)
        {
            pwd = user.Password;
            isApproved = user.IsApproved;
            if (CheckPassword(password, pwd))
            {
                if (isApproved)
                {
                    isValid = true;
                    user.LastLoginDate = DateTime.Now;
                    user.LastActivityDate = DateTime.Now;
                    try
                    {
                        db.SubmitChanges();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex);
                    }
                }
            }
            else
            {
                UpdateFailureCount(username, "password");
            }
        }
    }
    return isValid;
}

我现在看到问题了。我不知道这在MVC中是如何工作的,但是通过使用Authenticate_Request,您可以验证用户是否仍然有效。业务逻辑还可以再次检查用户是否仍然有效。但据我所知,没有办法迭代所有打开的会话和杀死所需的会话,即使在这种情况下,授权cookie应该在Session_Start事件上进行双重检查。另一种选择是在应用程序上添加一个全局invalidated_users列表,然后根据无效列表检查该用户。此列表应只包含在应用程序重新启动后失效的用户。

Link for Reading All Users Session:

http://weblogs.asp.net/imranbaloch/archive/2010/04/05/reading-all-users-session.aspx