如何使用 Windows 登录进行单点登录和桌面 Java 应用程序的 Active Directory 条目?
Posted
技术标签:
【中文标题】如何使用 Windows 登录进行单点登录和桌面 Java 应用程序的 Active Directory 条目?【英文标题】:How to use Windows login for single-sign-on and for Active Directory entries for Desktop Java application? 【发布时间】:2010-10-07 10:28:30 【问题描述】:我想让我的桌面 Java 应用程序进行单点登录 活动目录用户。分两步,我想:
-
确保特定用户已使用某些用户条目登录到 Windows。
从 Active Directory 中查看该用户的一些设置信息
使用Java: Programatic Way to Determine Current Windows User 我可以获得当前 Windows 用户的名称,但我可以依赖它吗?我认为
System.getProperty("user.name")
不够安全? (“user.name”似乎是从环境变量中获得的,所以我认为不能依赖它?)
问题Authenticating against Active Directory with Java on Linux 为我提供给定名称+密码的身份验证,但我想基于 Windows 登录进行身份验证?
对于 Active Directory 访问,LDAP 可能是选择?
【问题讨论】:
【参考方案1】:不支持。 Java 6 有改进,但还不够。
Java 有自己的 GSS 堆栈。问题在于单点登录,您需要从操作系统(而不是 Java 堆栈)获取 Kerberos 票证。否则用户必须再次进行身份验证(违背单点登录的目的)。
看看http://java.sun.com/developer/technicalArticles/J2SE/security/。往下看“Access Native GSS-API”,它谈到了一个新的系统属性 sun.security.jgss.native,当它设置为 true 时,会导致 Java 使用底层的 OS GSS 实现,从而可以访问 OS 级别的身份验证。完美!....除了它仅支持 Solaris 和 Linux,不支持 Microsoft Windows。
然而,Java 6 似乎确实有足够的支持来充当服务器,从 IE 接收 SPNEGO 身份验证请求,然后针对 Active Directory 对该用户进行身份验证。只是桌面客户端支持还不完整。
【讨论】:
是否有任何其他 JVM 提供对 Kerberos 票证的访问权限? 不过,Java 8 似乎有这种支持。 docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/…【参考方案2】:使用JAAS 和LDAP LoginModule。这将允许您插入底层 Java 安全基础架构。
当您需要使应用程序脱机或“调试”应用程序时,您可以轻松地将 LDAP 模块换成虚拟模块。这允许您继续测试您的“安全性”,而不依赖于 Active Directory。高度可测试、解耦,并且您可以在稍后的时间验证方案,几乎没有任何问题。
【讨论】:
谢谢,是否支持通过 Windows 登录进行身份验证? (这样当用户登录到 Windows 时,他/她不必为 java 应用程序单独输入用户名和密码)一开始我没有找到,继续寻找。 嗯。我见过的唯一这样做的模块是像 WebLogic 这样的更大框架的一部分......或者是为 Java 客户端设计的,用于将凭据传递给 Web 服务器。您可能必须使用本机调用编写一个小型 JAAS 提供程序才能可靠地执行此操作。 当与参数 useTicketCache 一起使用时,Krb5LoginModule 似乎能够使用操作系统票证缓存(Windows 登录时获得的凭据),而不是使用 LDAP LoginModule。似乎仍然存在一些问题,但这暂时有效..【参考方案3】:Project Waffle 具有客户端和服务器端代码,可在 Windows 上执行 SSO。它基于 JNA,不需要本地库。
【讨论】:
【参考方案4】:在http://jcifs.samba.org/查看 jCifs
除此之外,坚持使用 LDAP(实际上,这应该是我的第一次尝试,但是...)
【讨论】:
【参考方案5】:您是否考虑过使用 JNA api(允许您轻松地对操作系统进行本机调用)?
您可以通过http://msdn.microsoft.com/en-us/library/ms724432(VS.85).aspx 调用win32 方法GetCurrentUser
MSDN 文档。它位于 Advapi32.dll 中。
如果需要,它还有一个 unicode 版本,GetCurrentUserW。
你是对的。似乎环境变量可以更改,因此可能会误导使用。
我不确定 32/64 位窗口的跨平台影响。 如果您需要代码中的解决方案,我相信我可以为它写一些东西。
但是是的,只是一个想法:)
【讨论】:
【参考方案6】:您可能会通过使用Spring Security 获得最大的灵活性。您可以将它与 JAAS 和 LDAP 身份验证一起使用。
【讨论】:
以上是关于如何使用 Windows 登录进行单点登录和桌面 Java 应用程序的 Active Directory 条目?的主要内容,如果未能解决你的问题,请参考以下文章