【问题标题】:ActiveDirectoryMembershipProvider and Forms authenticationActiveDirectoryMembershipProvider 和 Forms 身份验证
【发布时间】:2012-11-30 03:48:14
【问题描述】:

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

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

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

    FormsAuthentication.SetAuthCookie(m.Username, true);

    ....

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

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

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

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

建议/正确的处理方式是什么?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    至于密码修改,一般不会修改用户的权限,所以应该是无害的,让他们继续工作。

    【讨论】:

    • 所以你是说我应该在每次请求时检查用户的密码是否正确,然后在密码更改时注销用户?那些 ActiveDirectoryMembershipProvider.ValidateUser 调用肯定有点贵...
    • @NoPyGod 我的意思是,当他们更改密码或退订时,您应该将其注销。除此之外,您只需检查一次密码,设置 cookie 即可。这是使用表单身份验证的正常方式。一个
    • 当用户密码更改时,Active Directory 不会通知我的 Web 应用程序,那么我将在哪里调用 SignOut()?我不确定你是否明白我在这里的意思,你曾经使用过 ActiveDirectoryMembershipProvider 吗?
    • @NoPyGod 好的,我错误地认为您实际上为您的用户提供了更改 AD 密码和停用自己的方法。关键且不明显的信息是用户完全在您的应用程序之外进行管理。我已经相应地更新了答案。
    【解决方案2】:

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

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

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

    我已经实现了它,并且效果很好。

    更多信息在这里

    Check if Active Directory password is different from cookie

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2023-04-10
      相关资源
      最近更新 更多