删除用户在其他浏览器上删除后再次登录
本文关键字:删除 登录 浏览器 用户 其他 | 更新日期: 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
, IPrincipal
和MembershipUser
,并将其添加到您的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