我正在使用 .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。
有谁知道我如何检测用户是否必须更改密码、帐户是否被锁定或过期、登录时间无效……或者用户是否输入了错误的密码?
非常感谢。