0

我在域上下文下对 PrincipalContext.ValidateCredentials 进行了一个非常简单的调用,导致未知原因导致误报。

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "DOMAINNAME"))
            {
                bool isValid = pc.ValidateCredentials("username", "password");
                Console.WriteLine(isValid);
            }

当我在 AD 服务器上查看安全审计时,它显示了一个事件 ID 为 4625 的审计失败事件,声称用户没有权限登录机器。我可以使用这些凭据登录到加入此域的终端服务器。在此之前,我对运行应用程序的帐户进行了成功审核,并且我能够成功验证其他用户的凭据。但是,我无法找到成功验证的帐户和未成功验证的帐户之间的任何区别,它们是所有相同域安全组的一部分。

帐户无法登录。

主题:安全 ID:NULL SID 帐户名称:- 帐户域:- 登录 ID:0x0

登录类型:3

登录失败的帐户:安全 ID:NULL SID 帐户名称:[已编辑] 帐户域:

失败信息: 失败原因: 用户不允许登录此计算机。状态:0xC000006E 子状态:0xC0000070

进程信息:调用者进程 ID:0x0 调用者进程名称:-

网络信息:工作站名称:[已编辑] 源网络地址:[已编辑] 源端口:62​​667

详细的身份验证信息:登录过程:NtLmSsp 身份验证包:NTLM Transited Services:- 包名称(仅限 NTLM):- 密钥长度:0

当登录请求失败时会生成此事件。它是在尝试访问的计算机上生成的。

主题字段指示请求登录的本地系统上的帐户。这通常是服务器服务等服务,或 Winlogon.exe 或 Services.exe 等本地进程。

登录类型字段指示所请求的登录类型。最常见的类型是 2(交互式)和 3(网络)。

进程信息字段指示系统上的哪个帐户和进程请求登录。

网络信息字段指示远程登录请求的来源。工作站名称并非始终可用,在某些情况下可能留空。

身份验证信息字段提供有关此特定登录请求的详细信息。- 中转服务指示哪些中间服务参与了此登录请求。- 包名称表示在 NTLM 协议中使用了哪个子协议。- 密钥长度表示生成的会话密钥的长度。如果没有请求会话密钥,这将为 0。

我似乎在这里失去了理智,任何可以提供的帮助将不胜感激。如果此时存在,我会考虑使用 PrincipalContext 的替代方案。

4

1 回答 1

1

正如您在此问题的评论部分中确认的那样,用户帐户必须登录到一组特定的计算机,其中不包括 DC 服务器,这就是您的 ValidateCredentials 无法正常工作的原因。

@Am_I_Helpful 是的,你完全正确,这就是问题所在。如果我更改用户登录到所有服务器的值,它会正常工作并返回 true。我猜我对 ValidateCredentials 在域上下文中如何工作的理解不正确,我假设它是一个有效的、未锁定的帐户,它会返回 true。他们实际上需要登录到服务器列表中的域服务器吗?

是的,如果您必须检查凭据(身份验证),那么您确实需要将域的域控制器包含在用户的登录工作站系统列表中!

于 2018-04-18T17:53:52.417 回答