ActiveDirectoryMembershipProvider和Forms身份验证

时间:2012-11-30 03:48:15

标签: asp.net-mvc active-directory asp.net-membership

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

我正在使用ActiveDirectoryMembershipProvider根据我们的域验证用户。

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

    FormsAuthentication.SetAuthCookie(m.Username, true);

    ....

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

问题是,如果用户的密码发生变化,他们仍然会保持登录状态。或者更糟糕的是,用户对我们公司抱有怨恨,他们仍然可以访问。

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

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

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

2 个答案:

答案 0 :(得分:1)

典型的解决方案是在用户取消订阅服务时强制注销,或者在更改密码时不常用。使用this method

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

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

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

答案 1 :(得分:1)

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

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

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

我已经实现了这一点并且完美无缺。

此处有更多信息

Check if Active Directory password is different from cookie