DirectoryEntry身份验证抛出COMException而不是DirectoryServicesCOMException

时间:2013-08-22 05:54:38

标签: authentication active-directory directoryentry comexception

我正在使用.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。

有谁知道如何检测用户是否需要更改密码,帐户是否已锁定或已过期,登录时间无效,......或者用户是否输入了错误的密码?

非常感谢。

0 个答案:

没有答案