我使用用户PrincipalContext类连接到Active Directory服务器,然后使用ValidateCredentials方法,如下所示:
new PrincipalContext(ContextType.Domain, <some url>, <some container>);
principalContext.ValidateCredentials(userName, password, ContextOptions.Negotiate);
some container参数是container类型;所有查询都在这个根"下执行;。同样根据指定容器"…"的这个答案;。。。将使用该DomainContext的所有查询限制为指定的容器">
然而,问题是,对于我公司的AD服务器,如果我指定了一个不存在的容器或只是胡言乱语,那么如果我指定的用户具有正确的密码,AD服务器仍然会找到一个用户。有人知道为什么用户仍然被找到吗?你能给我一些文件来解释这一点吗?
简单的答案是ValidateCredentials
不使用指定的容器,只是因为它不需要。它实际上并不搜索用户。它只是尝试使用指定的凭据对服务器进行身份验证。
您可以在这里看到ValidateCredentials
的源代码,它最终调用CredentialValidator.Validate
(一个内部类(。
在PrincipalContext
的构造函数中,它创建了CredentialValidator
对象,但您会注意到它没有将container
传递给它,只将name
(域名(传递给它。
_credValidate = new CredentialValidator(contextType, name, _serverProperties);
_serverProperties
变量也是仅根据服务器名称构建的,而不是容器,这可以从ReadServerConfig
方法中看到。