1

我有一个使用表单身份验证的 ASP.NET MVC Web 应用程序。

我正在使用 ActiveDirectoryMembershipProvider 针对我们的域验证用户。

if (Membership.ValidateUser(m.Username, m.Password))
{

    FormsAuthentication.SetAuthCookie(m.Username, true);

    ....

这意味着用户只有在登录时才会得到验证。

问题当然是,如果用户的密码更改,他们仍然保持登录状态。或者更糟糕的是,用户带着怨恨离开我们公司,他们仍然可以访问。

我原以为这样一个简单的用例会有一个明显的答案,但我已经坚持了一段时间了。

我可以将用户密码放入会话中,然后每次都对其进行验证,但这感觉不对。

处理此问题的建议/正确方法是什么?

4

2 回答 2

1

典型的解决方案是在用户取消订阅服务或更改密码时强制注销。使用此方法

    FormsAuthentication.SignOut();
    FormsAuthentication.RedirectToLoginPage();

如果可以在应用程序之外(即 Active Directory)停用用户,则典型做法是依赖会话超时,并且可能会再次请求凭据以进行关键操作。如果您绝对不能在会话仍处于活动状态时允许停用的用户工作,那么是的,您必须检查每个请求的凭据。由于在应用程序中存储密码是一个非常糟糕的主意,这意味着您必须在每个请求上都要求提供凭据,这可以说是一个更糟糕的主意。

至于密码更改,通常不会修改用户的权限,因此允许他们继续工作应该是无害的。

于 2012-11-30T04:12:09.887 回答
1

答案是定期(每 30 分钟左右)检查 User.IsApproved 和 User.LastPasswordChangedDate 以确保用户凭据仍然有效。

为此,您需要手动创建 FormsAuthenticationTicket 和 cookie,而不是使用 FormsAuthentication.SetAuthCookie。

将验证用户的日期放在 UserData 中,并将其与 LastPasswordChangedDate 进行比较。

我已经实现了这一点,并且效果很好。

更多信息在这里

检查 Active Directory 密码是否与 cookie 不同

于 2013-01-03T00:57:06.787 回答