如何使用 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 条目?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用LDAP用户单点登录到Horizon桌面和应用

单点登录原理和java实现简单的单点登录

java实现的单点登录

java实现简单的单点登录

java实现简单的单点登录 (转)

如何登录到Windows腾讯云服务器进行管理