通过本机Java API验证Windows用户凭据

时间:2012-10-25 14:14:30

标签: java windows validation credentials

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

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

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

如果有人以前做过这件事,或者知道如何完成,请告诉我。

谢谢, PIYUSH

1 个答案:

答案 0 :(得分:8)

凭据凭据,您指的是用户的实际密码?然后,您可以使用LDAP尝试连接到Windows Active Directory。请参阅相关问题:Windows password Authentication with LDAP

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

有一个名为'华夫饼干'的项目将其包装在一个更有用的库中,参见例如https://github.com/dblock/waffle/blob/master/Source/JNA/waffle-jna/src/waffle/windows/auth/impl/WindowsAuthProviderImpl.java中的logonUser函数。这直接与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()); 
}