SSO 如何与 Active Directory 一起工作,以便用户透明地登录到内部网 Web 应用程序?

SSO 如何与 Active Directory 一起工作,以便用户透明地登录到内部网 Web 应用程序?

有人告诉我,可以制作一个不需要登录的 Web 应用程序。用户登录 Windows,Windows 通过 Active Directory (LDAP) 查找进行身份验证。然后,他们应该能够访问我的 Web 应用程序,并且永远不会看到登录提示。这些客户一直将此称为单点登录(可能不正确,也是我感到困惑的部分原因)。

但是,从我读到的 Tomcat 文档中的单点登录来看:

当您希望让用户能够登录到与您的虚拟主机关联的任何一个 Web 应用程序,然后让同一虚拟主机上的所有其他 Web 应用程序识别其身份。

这对我来说非常清楚。用户只需登录一次即可访问 tomcat 实例上的每个 webapp。但是,我需要做的是以某种方式让他们登录,而无需向我的 tomcat 服务器提供任何凭据。

因此,为了实现这个目的我设想:

  • 用户请求某个页面
  • 服务器看不到会话令牌,然后向客户端请求一些凭据。
  • 客户端浏览器无需用户干预即可向服务器提供一些凭据。
  • 然后,使用客户端浏览器提供的凭据在 LDAP 中进行查找。

我见过一些使用客户端证书的例子……特别是 DoD PKI 系统,这对我来说很有意义,因为在那些情况下配置 Tomcat 以请求客户端证书,但仅登录到 Windows,我不明白这将如何工作以及浏览器将向服务器传递什么信息等。这是 NTLM 的用途吗?

答案1

首先,如果其他用户碰巧访问此页面,只有某些身份验证方法允许您进行无提示 SSO。这些方法包括NTLM凯尔伯罗斯. 另一方面,LDAP 永远不会给您提供无提示的 SSO。

NTLM 实际上是 NTLMv1 和 NTLMv2。它们非常不同,NTLMv1 因严重的安全问题而被弃用。您应该避开那些无法正确识别它们是否支持 NTLMv1 或 NTLMv2 的 Java 身份验证解决方案,因为它们仅在其文档中使用“NTLM”一词。很可能上述安全解决方案的开发人员自己也不知道,这更是寻找安全出口的理由。

与传统观念相反,NTLMv1 和 NTLMv2 均已由 Microsoft 完整记录,但您仍会发现声称已“逆向工程”该协议的解决方案。确实,在 Microsoft 记录该协议之前(我相信大约在 2006 年或 2007 年),这确实是必要的。无论如何,NTLMv1 是不行的。NTLMv2 本身没有问题,但 Microsoft 已在其所有产品中逐步淘汰 NTLM(以任何形式),转而采用 Kerberos 身份验证。NTLMv1 早已过时,NTLMv2 现在仅在 Microsoft 没有域控制器可用的情况下使用。底线:NTLM(以任何形式)都不是真正的前进方向。我们实际上应该向 Microsoft 致敬,因为它在这里采取了基于标准的方法。

这留给您 Kerberos。Microsoft 已创建一种协议,用于通过 HTTP 协商和传输身份验证信息。这在 Microsoft 产品中称为“集成 Windows 身份验证“但它已被确定为官方标准,名为新加坡国家邮政局。这就是您应该寻找的。SPNEGO 支持 NTLMv2 和 Kerberos 作为底层身份验证机制,但出于上述原因,您应该以 Kerberos 而不是 NTLMv2 为目标。

我已成功使用以下方法将多个 Tomcat 应用程序(在 Linux/Solaris 上运行)与 Active Directory 集成:SourceForge 上的 SPNEGO 项目。我发现这是最简单的方法。这为您提供了类似于 Sharepoint 服务器的快速 SSO。这很可能是您的用户可以在谈论“SSO”时所期望的。正确获取 Kerberos 配置、生成密钥并在 Active Directory 中设置“虚拟”帐户可能很麻烦,但一旦您正确完成,它就会像魔法一样工作。

我唯一不喜欢的是SourceForge 上的 SPNEGO 项目是我不了解它执行身份验证的频率。我怀疑它对每个页面浏览都执行一次身份验证,而不是每个会话执行一次。也许我错了。无论如何:这突出了 SSO 解决方案中需要考虑的另一件事:您不想实施一种用不必要的请求“垃圾邮件”您的身份提供者(例如 Active Directory)的解决方案。

答案2

在 Windows Active Directory 环境中,单点登录是指访问内部网页时需要携带您的 Windows 登录权限,并且 Web 服务器可以根据这些权限执行操作。NTLM 就是用于此目的,但较新的实现使用的是 Kerberos。

如果您打开 Sharepoint Server 网站,它无需登录用户名和密码即可知道您是谁,但这仅适用于同一网络上的内部网站,我认为它在公共网站上工作没有多大意义。(我不知道您指的是 Apache vhost 中的“虚拟主机”还是外包托管服务器)。

以下是一份 Microsoft 文档,描述了 Kerberos 身份验证如何对运行 IIS / ASP.Net 的 Web 服务器进行操作:http://msdn.microsoft.com/en-us/library/ff647076.aspx

看起来可以使用 Apache/Tomcat/Java 来实现。以下是一份 PDF,描述了英国大学的实现:http://gfivo.ncl.ac.uk/documents/UsingKerberosticketsfortrueSingleSignOn.pdf以及一个针对它的 Codeplex 项目:http://tomcatspnego.codeplex.com/并且 Openfire 有一些与 Java/Kerberos 一起使用的文档(http://community.igniterealtime.org/docs/DOC-1060)。

答案3

听起来您正在描述 Microsoft 所指的集成 Windows 身份验证。

Tomcat 似乎支持 Windows 身份验证,基于本文

答案4

首先,您无法避免登录。如果您想识别用户,就必须让他们登录。忘记 NTLM,Kerberos 可以帮您 - 它可以以完全透明的方式完成所有事情。

SingleSignOnValve 不是您想要的。如果您使用 Tomcat 7,则可以使用SpnegoAuthenticator但在 6 你必须使用

相关内容