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