我有一个使用表单身份验证的ASP.NET MVC Web应用程序。
我正在使用ActiveDirectoryMembershipProvider根据我们的域验证用户。
if (Membership.ValidateUser(m.Username, m.Password))
{
FormsAuthentication.SetAuthCookie(m.Username, true);
....
这意味着用户只有在登录时才会得到验证。
问题是,如果用户的密码发生变化,他们仍然会保持登录状态。或者更糟糕的是,用户对我们公司抱有怨恨,他们仍然可以访问。
我原以为这样一个简单的用例会有一个明显的答案,但我已经坚持了一段时间了。
我可以将用户密码放在会话中,然后每次都验证它,但这感觉不对。
建议/正确处理此问题的方法是什么?
答案 0 :(得分:1)
典型的解决方案是在用户取消订阅服务时强制注销,或者在更改密码时不常用。使用this method:
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
如果可以在应用程序外部(即Active Directory)停用用户,则典型做法是依赖会话超时,并可能再次请求关键操作的凭据。如果在会话仍处于活动状态时绝对不能允许已停用的用户工作,那么是的,您必须检查每个请求的凭据。由于在应用程序中存储密码是一个非常糟糕的主意,这意味着您将不得不在每个请求上请求凭据,这可能是一个更糟糕的想法。
对于密码更改,它通常不会修改用户的权限,因此允许它们继续工作应该是无害的。
答案 1 :(得分:1)
答案是定期(每30分钟左右)检查User.IsApproved和User.LastPasswordChangedDate以确保用户凭据仍然有效。
为此,您需要手动创建FormsAuthenticationTicket和cookie,而不是使用FormsAuthentication.SetAuthCookie。
将验证用户的日期放在UserData中,并将其与LastPasswordChangedDate进行比较。
我已经实现了这一点并且完美无缺。
此处有更多信息