3

我正在使用 .NET 并创建一个 DirectoryEntry 并访问 NativeObject 成员以针对 AD 验证用户的凭据。

在某些情况下,登录会失败,因为设置了“用户下次登录时必须更改密码”标志,或者由于登录时间不匹配,当前不允许用户登录。

我想区分是否发生了其中一种情况,或者用户是否输入了错误的密码。

如果我使用参数 AuthenticationTypes.None 创建 DirectoryEntry 对象,如果登录失败,则会引发 DirectoryServicesCOMException。此异常中的信息可用于确定例如是否设置了“密码更改”标志。

不幸的是,使用 AuthenticationTypes.None 不是一种安全的方式,因为会传输密码。

如果我使用参数 AuthenticationTypes.Secure 创建 DirectoryEntry 对象,则会引发 COMException 而不是 DirectoryServicesCOMException。此异常非常通用,因为它始终具有错误代码 ERROR_LOGON_FAILURE。我无法区分用户是否输入了错误的密码或是否必须更改密码。

MSDN 文档说:如果设置了 AuthenticationTypes.Secure,WinNT 提供程序使用 NTLM 对客户端进行身份验证。我想这会导致一种不同的行为,即只抛出一个 COMException 。

有效,但不安全:

var de = new DirectoryEntry(path, user, pass, AuthenticationTypes.None);

安全,但只抛出 COMException:

var de = new DirectoryEntry(path, user, pass, AuthenticationTypes.Secure);

第一个选项使用基本身份验证并引发特定的 DirectoryServicesCOMException,第二个选项使用 NTLM 并仅引发通用 COMException。

有谁知道我如何检测用户是否必须更改密码、帐户是否被锁定或过期、登录时间无效……或者用户是否输入了错误的密码?

非常感谢。

4

0 回答 0