.net 为什么PrincipalContext::ValidateCredentials接受密码过期的凭据?

iyr7buue  于 2022-11-19  发布在  .NET
关注(0)|答案(1)|浏览(218)

我们有一个应用程序,它使用内部ActiveDirectory域验证用户凭据。为此,它使用.NET Framework中的PrincipalContext::ValidateCredentials方法。
在调查另一个问题时,我们发现即使密码过期,该方法也会返回true。这导致用户即使密码过期数月,甚至在某些情况下过期数年,也可以访问我们的互联网系统。这似乎很奇怪,是一个严重的安全缺陷,我们现在需要修复它。
我试着在网上查找这种行为,但到目前为止我什么也没找到。据我所知,如果帐户有任何问题,这个方法确实应该拒绝凭据。例如,当帐户被锁定时,它确实返回false。
我怀疑这是ValidateCredential方法本身的错误。它已经存在太久了。它使用起来相当简单,所以我不认为我们在这里搞砸了。下面是我们的代码:

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domainName))
{
    bool valide = context.ValidateCredentials(userName, passWord);
    // Remaining code omitted
}

那么,这里可能发生了什么?什么可能导致ValidateCredentials接受过期的密码?

xfb7svmp

xfb7svmp1#

源代码显示它尝试了简单的SSL绑定和协商。这可能是出于某种原因允许它的身份验证方法之一。为什么它会允许它,我不知道。
您可以在构造函数中指定与PrincipalContext不同的ContextOptions。例如(因为您说过SSL按您期望的方式执行):

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domainNam 
       , ContextOptions.SecureSocketLayer | ContextOptions.SimpleBind))
{
    bool valide = context.ValidateCredentials(userName, passWord);
    // Remaining code omitted
}

但是如果无论如何都要更改代码,可以考虑直接使用LdapConnection,因为异常会向您显示失败的原因,如that example I linked to中所述。

相关问题