我正在使用来自PrincipalContext.ValidateCredentials
命名空间的System.DirectoryServices.AccountManagement
方法来验证针对Active服务器的用户凭据。代码样本:
private bool CheckIfCredentialsAreValidInDomain(string pLogin, string pPassword)
{
bool areCredentialsValidInDomain = true;
using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
areCredentialsValidInDomain = context.ValidateCredentials(login, password);
}
return areCredentialsValidInDomain;
}
在客户环境中有一个域和多个DC (6或更多)DC。我不把DC名称传递给PrincipalContext
构造函数--假设DC定位器服务正在做它的工作--这对我来说并不重要,因为哪个特定的DC是从可用DC列表中使用的。一切都很好,但我有这样一种情况,即用户不直接登录域(在启动使用此验证的应用程序之前),但他的计算机在物理上连接到客户的网络。
此用户的域帐户最近已被禁用。原因:在过去的X个月里,他没有登录到这个域名。但在此之前,他每天都在使用应用程序,因此调用ValidateCredentials
方法并返回true。但是由于不清楚的原因,这个动作对于DC来说是“跨部门的”,并且这个验证没有被标记。
那么ValidateCredentials
是如何工作的呢?它是设置了LastLogon和lastLogonTimestamp用户的属性,还是只是告诉我们凭据是否有效?它在DC上注册任何事件日志条目吗?
发布于 2022-08-31 14:57:26
PrincipalContext
的源代码现在可用了。ValidateCredentials()
调用CredentialValidator.Validate()
(内部类)。
这最终调用了lockedLdapBind()
,它使用凭据调用LdapConnection.Bind()
。
它实际上是针对服务器测试凭据的。因此,要么您的代码的这一部分没有实际运行,要么正在测试的帐户没有真正被禁用。
我在代码中注意到的是,您将变量login
和password
传递给ValidateCredentials
。但是,方法的参数称为pLogin
和pPassword
。这是您的问题中的一个错误,还是您的代码中的错误?如果这是准确的,那么您实际上并不是在测试传递给您的方法的凭据。
https://stackoverflow.com/questions/73556453
复制相似问题