我需要存储 Windows 用户名和凭据,以便稍后运行需要这些凭据的某些进程。
当我从用户收集这些作为输入时,我想验证凭据是否正确。 Java 中是否有原生 API 可以帮助我验证 Windows 系统凭据?
我正在浏览 LoginContext
类,但看起来它只能用于 SSO 目的。
我收到的另一个建议是尝试启动一个需要这些凭据的进程,看看它是否有效。但这看起来不是正确的方法。
如果有人以前做过这个或者知道如何完成,请告诉我。
谢谢, 皮尤什
最佳答案
凭据是指用户的实际密码吗?然后您可以使用 LDAP 尝试连接到 Windows Active Directory。查看相关问题:Windows password Authentication with LDAP
一种更精细的方法是使用 native 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/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());
}
关于java - 通过 native Java API 验证 Windows 用户凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13070587/