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); 返回重定向到操作(“索引”、“主页”); }
我使用以下代码登录我的网站。我面临的问题是,当我在特定浏览器上与用户登录,同时在不同浏览器上与其他用户登录,然后删除该用户(在其他浏览器上登录)。尽管如此,我仍然能够在删除的用户登录的情况下浏览页面 我没有找到一个公平的解决方案,将身份验证逻辑放在每一页上。我的网站采用MVC模式,使用基于表单的身份验证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为您处理所有这些。但似
请建议如何进行登录用户会话验证并实现此目的。通常,如果为控制器或操作定义了
[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语言中,也无法迭代所有打开的会话并杀死需要的会话