2010-12-07 24 views
2

我有一个使用System.DirectoryServices和LDAP进行身份验证的.Net客户端WPF应用程序。在应用程序启动时,我想强制用户使用他们的域帐户重新进行身份验证(这是他们如何登录到Windows)。我知道我可以使用以下方式在连接可用时执行身份验证。使用.Net在断开连接时对Active Directory进行身份验证

DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, 
      userName, password); 

皱纹是应用程序有时由可能没有连接的远程用户使用。即使断开连接,Windows本身仍允许域用户登录。是否有类似的方法来使用.Net框架在断开连接的环境中对用户进行身份验证?

回答

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 

当断开连接时,它显示为根据上次登录的本地缓存版本进行验证。

2

如果没有连接,就没有连接。 Windows维护该用户最后一次登录的缓存版本(意味着新用户无法登录到没有连接到域的计算机)。您可以使用本地系统身份验证来确定哪个用户正在使用系统,并根据此权限确定本地缓存权限。这些方法仍然位于System.DirectoryServices命名空间内,但解析查询的位置会发生变化(我不相信它会在本地接受LDAP查询)。

编辑:
您还可以找到一些班级,在System.Security/System.Security.Permissions命名空间,将有助于这些需求。

+0

你是对的,它不会允许LDAP查询,除非你登录到域控制器,在这种情况下,这不会是一个问题。 – CodingGorilla 2010-12-07 19:20:13

+0

@Coding Gorilla - Tru dat。我的假设是,这是针对远程系统上的应用程序。如果你在一个DC上,那么这个网络在技术上从未断开。 – 2010-12-07 19:21:18

相关问题