我们有一个应用程序,它使用内部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接受过期的密码?
1条答案
按热度按时间xfb7svmp1#
源代码显示它尝试了简单的SSL绑定和协商。这可能是出于某种原因允许它的身份验证方法之一。为什么它会允许它,我不知道。
您可以在构造函数中指定与
PrincipalContext
不同的ContextOptions
。例如(因为您说过SSL按您期望的方式执行):但是如果无论如何都要更改代码,可以考虑直接使用
LdapConnection
,因为异常会向您显示失败的原因,如that example I linked to中所述。