9

我需要存储 Windows 用户名和凭据,以便稍后运行一些需要这些凭据的进程。

当我从用户那里收集这些作为输入时,我想验证凭据是否正确。Java中是否有可以帮助我验证Windows系统凭据的本机api?

我正在LoginContext上课,但看起来它只能用于 SSO 目的。我收到的另一个建议是尝试启动一个需要这些凭据的进程,看看它是否有效。但这看起来不是正确的方法。

请让我知道是否有人以前这样做过或知道如何完成它。

谢谢,皮尤什

4

1 回答 1

9

通过凭据,您的意思是用户的实际密码?然后,您可以使用 LDAP 尝试连接到 Windows Active Directory。请参阅相关问题:Windows 密码身份验证与 LDAP

更精细的方法是使用本机 Windows 调用,可能通过 JNA 平台:http: //jna.java.net/javadoc/platform/com/sun/jna/platform/win32/package-summary.html

有一个名为“waffle”的项目将其包装在一个更有用的库中,例如参见https://github.com/dblock/waffle/blob/master/Source/JNA/waffle-jna/src/waffle/中的 logonUser 函数windows/auth/impl/WindowsAuthProviderImpl.java。这直接与 win32 advapi32.dll 对话。

这也将允许您在没有域的情况下为本地用户进行 Windows 身份验证。

编辑:来自 OP 的完整工作代码

import com.sun.jna.platform.win32.Advapi32; 
import com.sun.jna.platform.win32.Kernel32; 
import com.sun.jna.platform.win32.WinBase; 
import com.sun.jna.platform.win32.WinNT.HANDLEByReference; 

HANDLEByReference phUser = new HANDLEByReference() 
if(! Advapi32.INSTANCE.LogonUser("administrator", InetAddress.getLocalHost().getHostName(),
    "password", WinBase.LOGON32_LOGON_NETWORK, WinBase.LOGON32_PROVIDER_DEFAULT, phUser)) 
{
  throw new LastErrorException(Kernel32.INSTANCE.GetLastError()); 
}
于 2012-10-25T14:55:24.987 回答