Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已删除用户登录,即使在其他浏览器上删除 var query=来自AdminModelContext.Users中的p 其中p.UserName==model.UserName&&p.Password==encryptPassword &&p.IsDeleted==false 选择p; IList userList=query.ToList(); 如果(userList.Count()>0) { FormsAuthentication.SetAuthCookie(model.UserName,model.RememberMe); 如果(检查URL(返回URL)) { 返回重定向(returnUrl); } SetRoleForUser(用户列表[0].RolesId); LoggerService.Info(string.Format(“用户登录成功:{0}”), model.UserName); 返回重定向到操作(“索引”、“主页”); }_C#_Entity Framework_Asp.net Mvc 3_Forms Authentication - Fatal编程技术网

C# 已删除用户登录,即使在其他浏览器上删除 var query=来自AdminModelContext.Users中的p 其中p.UserName==model.UserName&&p.Password==encryptPassword &&p.IsDeleted==false 选择p; IList userList=query.ToList(); 如果(userList.Count()>0) { FormsAuthentication.SetAuthCookie(model.UserName,model.RememberMe); 如果(检查URL(返回URL)) { 返回重定向(returnUrl); } SetRoleForUser(用户列表[0].RolesId); LoggerService.Info(string.Format(“用户登录成功:{0}”), model.UserName); 返回重定向到操作(“索引”、“主页”); }

C# 已删除用户登录,即使在其他浏览器上删除 var query=来自AdminModelContext.Users中的p 其中p.UserName==model.UserName&&p.Password==encryptPassword &&p.IsDeleted==false 选择p; IList userList=query.ToList(); 如果(userList.Count()>0) { FormsAuthentication.SetAuthCookie(model.UserName,model.RememberMe); 如果(检查URL(返回URL)) { 返回重定向(returnUrl); } SetRoleForUser(用户列表[0].RolesId); LoggerService.Info(string.Format(“用户登录成功:{0}”), model.UserName); 返回重定向到操作(“索引”、“主页”); },c#,entity-framework,asp.net-mvc-3,forms-authentication,C#,Entity Framework,Asp.net Mvc 3,Forms Authentication,我使用以下代码登录我的网站。我面临的问题是,当我在特定浏览器上与用户登录,同时在不同浏览器上与其他用户登录,然后删除该用户(在其他浏览器上登录)。尽管如此,我仍然能够在删除的用户登录的情况下浏览页面 我没有找到一个公平的解决方案,将身份验证逻辑放在每一页上。我的网站采用MVC模式,使用基于表单的身份验证 请建议如何进行登录用户会话验证并实现此目的。通常,如果为控制器或操作定义了[Authorize]属性,则每次回发时都会检查身份验证 内置MembershipProvider为您处理所有这些。但似

我使用以下代码登录我的网站。我面临的问题是,当我在特定浏览器上与用户登录,同时在不同浏览器上与其他用户登录,然后删除该用户(在其他浏览器上登录)。尽管如此,我仍然能够在删除的用户登录的情况下浏览页面

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


请建议如何进行登录用户会话验证并实现此目的。

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

内置MembershipProvider为您处理所有这些。但似乎您正在使用自己的用户数据库。然后,您必须实现自己的
成员资格提供程序
IPrincipal
成员资格用户
,并将其添加到Web.config中,以替换默认的

您将在此处了解如何实现自己的会员资格提供商:

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

您自己的MembershipProvider中的validateUser函数可能如下所示

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

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

内置MembershipProvider为您处理所有这些。但似乎您正在使用自己的用户数据库。然后,您必须实现自己的
成员资格提供程序
IPrincipal
成员资格用户
,并将其添加到Web.config中,以替换默认的

您将在此处了解如何实现自己的会员资格提供商:

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

您自己的MembershipProvider中的validateUser函数可能如下所示

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

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

让我们看看控制流:

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;
}
此时,票证A没有发生任何变化,因为票证独立于凭证。当票证A过期时,他们将被要求出示他们的凭证,并且登录失败

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

在我构建的登录系统中,我通过创建两个票证来处理这方面的问题,一个票证存储在表单Auth-ticket中,作为正常的,有一个较长的持续时间,另一个票证存储在
HttpRuntime.Cache
,我将这个票证的缓存过期时间设置为15分钟

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


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

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

让我们看看控制流:

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;
}
此时,票证A没有发生任何变化,因为票证独立于凭证。当票证A过期时,他们将被要求出示他们的凭证,并且登录失败

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

在我构建的登录系统中,我通过创建两个票证来处理这方面的问题,一个票证存储在表单Auth-ticket中,作为正常的,有一个较长的持续时间,另一个票证存储在
HttpRuntime.Cache
,我将这个票证的缓存过期时间设置为15分钟

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


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

我现在看到问题了。我不知道这在MVC中是如何工作的,但是通过使用Authenticate\u请求,您可以验证用户是否仍然有效。业务逻辑还可能再次检查用户是否仍然有效。但据我所知,即使是在c语言中,也无法迭代所有打开的会话并杀死需要的会话