使用.Net在断开连接时对Active Directory进行身份验证

3
我有一款使用System.DirectoryServices和LDAP进行身份验证的.Net客户端WPF应用程序。在启动应用程序时,我希望强制用户使用他们的域账户重新进行身份验证(这是他们登录Windows的方式)。我了解到,当有连接可用时,可以使用以下内容执行身份验证。
DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain,
            userName, password);

问题在于应用程序有时会被远程用户使用,这些用户可能没有连接。即使断开连接,Windows本身仍允许域用户登录。是否有类似的方法可以使用.Net Framework在断开连接的环境中验证用户?

2个回答

2
如果没有连接,就没有连接。Windows会维护该用户的上次登录的缓存版本(这意味着新用户无法登录到没有与域连接的计算机)。您可以使用本地系统认证来查找谁在使用该系统,并根据此确定本地缓存权限。这些方法仍将位于System.DirectoryServices命名空间中,但查询解析的位置会发生变化(我不认为它会在本地接受LDAP查询)。
编辑:您还可以在System.Security / System.Security.Permissions命名空间中找到一些类来实现这些需要。

你是正确的,除非你已经登录到域控制器,否则它不允许LDAP查询,如果是这样的话,这就不是一个问题。 - CodingGorilla
@编程大猩猩 - 确实如此。我假设这是用于远程系统上的应用程序。如果您在数据中心,则网络从技术上讲永远不会断开连接。 - Joel Etherton
是的。这是在定期断开连接的环境中,没有网络连接。了解检查权限,但我找不到任何方法来重新验证已经登录的用户。换句话说,在应用程序运行之前再次提示他们输入凭据并进行身份验证。 - bkstill

2

相信我找到了一种方法,可以使用advapi32.dll的LogonUser函数来实现这一点。

 Dim tokenHandle As New IntPtr(0)
 Const LOGON32_PROVIDER_DEFAULT As Integer = 0
 Const LOGON32_LOGON_INTERACTIVE As Integer = 2
 tokenHandle = IntPtr.Zero
 Dim returnValue As Boolean = LogonUser("<username>", "<domain>", "<password>", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, tokenHandle)

 Private Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As [String], _
                        ByVal lpszDomain As [String], ByVal lpszPassword As [String], _
                        ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, _
                        ByRef phToken As IntPtr) As Boolean

当断开连接时,这似乎会针对上次登录的本地缓存版本进行验证。


上面的代码将密码作为字符串传递。更安全的方法是将密码作为SecureString获取,将其编组到非托管内存中,然后将密码作为IntPtr传递。请参阅MSDN上的示例。 - bkstill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接