我在域上下文下对PrincipalContext.ValidateCredentials进行了一个非常简单的调用,结果是由于未知的原因而产生了假阴性。
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "DOMAINNAME"))
{
bool isValid = pc.ValidateCredentials("username", "password");
Console.WriteLine(isValid);
}当我在AD服务器上查看安全审计时,它会显示一个事件ID 4625的审计失败事件,声称用户没有登录机器的权限。我可以使用这些凭据登录到连接到此域的终端服务器。在此之前,对运行应用程序的帐户进行了成功的审计,并且能够成功地验证其他用户的凭据。但是,我无法在成功验证的帐户和没有验证的帐户之间找到任何区别,它们是所有相同域安全组的一部分。
帐户登录失败。 主题:安全ID:空SID帐户名称:-帐户域:-登录ID: 0x0 登录类型:3 登录失败的帐户:安全ID: NULL SID帐户名称:已编辑的帐户域:失败信息:失败原因:用户不允许在此计算机上登录。现状: 0xC000006E分组状态: 0xC0000070 进程信息:调用进程ID: 0x0调用进程名称:- 网络信息:工作站名称:已编辑源网络地址:已编辑源端口: 62667 详细身份验证信息:登录过程: NtLmSsp身份验证包: NTLM传输服务:-包名(仅NTLM):-密钥长度:0 此事件是在登录请求失败时生成的。它是在尝试访问的计算机上生成的。 Subject字段指示请求登录的本地系统上的帐户。这通常是服务器服务之类的服务,或者是本地进程(如Winlogon.exe或Services.exe )。 “登录类型”字段指示请求的登录类型。最常见的类型是2(交互式)和3(网络)。 字段指示系统上请求登录的帐户和进程。 “网络信息”字段指示远程登录请求来自何处。工作站名称并不总是可用的,在某些情况下可能是空白的。 身份验证信息字段提供有关此特定登录请求的详细信息。-中转服务表明哪些中间服务参与了这一登录请求。-包名指示在NTLM协议中使用了哪个子协议。键长度表示生成的会话密钥的长度。如果没有请求会话密钥,则为0。
我似乎在这里失去了理智,任何可以提供的帮助都将是非常感谢的。如果此时存在PrincipalContext,我将考虑使用一种替代方案。
发布于 2018-04-18 17:53:52
正如您在this question's comment section中确认的那样,用户帐户必须登录到一组特定的计算机,其中不包括DC服务器,这就是ValidateCredentials无法工作的原因。
@Am_I_Helpful是的,你是对的,这就是问题所在。如果我更改用户登录到所有服务器的值,它将正确工作并返回true。我想我对ValidateCredentials如何在域上下文中工作的理解是不正确的,我认为如果它是一个有效的、未锁定的帐户,它将返回true。它们实际上需要登录到服务器列表中的域服务器吗?
是的,如果您必须检查凭据(身份验证),那么您确实需要将域的域控制器包括在用户的系统登录工作站列表中!
https://stackoverflow.com/questions/49901615
复制相似问题