Windows java Web 应用程序 SSO 的集成身份验证

Windows integrated authentication for java web application SSO

背景:我目前有一个 java 网络应用程序,它在我 Mac 的本地主机上 运行。用户可以登录到 Web 应用程序,并且他们的凭据也会针对 OpenLDAP 服务器进行验证,该服务器也在我本地计算机的某个端口上 运行(特别是使用 this docker image)。 Web 应用程序包括与 LDAP 服务器交互以提供登录用户名和密码的代码。验证成功后,用户将登录并可以继续使用该应用程序的功能。

问题:此 Web 应用程序将部署到将使用 Windows 的客户端。他们正在请求 SSO 功能 - 即成功登录到他们域下的 windows 机器后,他们 运行 就无需再登录 Web 应用程序了。客户端不能在他们的机器上安装其他 Java 应用程序 运行ning 这将有助于 SSO - 只需登录到他们的 windows 机器就可以绕过登录 Web 应用程序的需要,这意味着Windows 需要以某种方式配置,Web 应用程序需要以某种方式配置 SSO。出于测试目的,我在 运行 正在 运行 的同一台机器上使用 windows 7 虚拟机,并在其上测试 Web 应用程序。

我研究过 SPNEGO、Java GSS API(看起来它需要客户端代码才能与服务器通信)、Kerberos、Windows IIS 等。我知道如何在 Windows 中启用 windows 集成身份验证,但我不知道如何在我的 Web 应用程序中实际使用它来启用 SSO。基本上,在这些情况下,我仍在为如何在我的特定案例中实施 SSO 功能而苦苦挣扎。以下是一些具体问题:

  1. 是否可以将浏览器配置为将它们正在 运行 连接的计算机的加密 windows 凭据发送到 Web 应用程序,然后可以由 Web 应用程序解密并针对 LDAP 进行身份验证?如果是这样,它是如何工作的?
  2. 能否将 windows 登录凭据配置为指向对其进行验证的 LDAP 服务器?
  3. 总体而言,如何在 windows 机器上为 Web 应用程序 运行ning 集成单点登录,其中 Web 应用程序配置为通过 LDAP 服务器验证凭据?

Windows SSO 基于 Kerberos,而不是 LDAP。人们通常将它们混淆的原因是 Microsoft Active Directory 同时充当 LDAP 服务器和 Kerberos 服务器。

如果您的 Windows 用户需要透明身份验证 (SSO),则必须实施 Kerberos 身份验证。

他们为 Web 应用程序实现 Kerberos 的方式称为 SPNEGO。

您需要执行以下操作:

  1. 在 Active Directory 中为您的服务器创建一个服务帐户,比如 REALM\svc_server
  2. 为您的服务器创建一个 SPN,它将您服务器的域名绑定到该服务器帐户。如果您的服务器是 https://server.acme.com 上的 运行,则它应该是 HTTP/server.acme.com
  3. 如果 windows 用户登录到域 REALM 并转到 https://server.acme.com 浏览器将根据名称 HTTP/server.acme.com 查找 SPN,从请求 Kerberos 票证Active Directory 并根据 SPNEGO 规范
  4. 在授权 header 中将其发送到服务器
  5. 现在您只需要使用 built-in Java Kerberos API 或使用某些 third-party 库(kerb4j, spring-security-kerberos、e.t.c.)

如您所见,此身份验证流程中未涉及 LDAP(尽管下一步可将其用于授权)