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

标签 java ldap kerberos windows-authentication spnego

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

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

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

  1. 能否将浏览器配置为将其运行机器的加密 Windows 凭据发送到网络应用程序,然后网络应用程序可以对其进行解密并针对 LDAP 进行身份验证?如果是这样,它是如何工作的?
  2. 能否将 Windows 登录凭据配置为指向验证它们的 LDAP 服务器?
  3. 总体而言,我如何为在 Windows 计算机上运行的 Web 应用程序集成单点登录,其中 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,它将您的服务器的域名绑定(bind)到该服务器帐户。如果您的服务器在 https://server.acme.com 上运行它应该是 HTTP/server.acme.com
  3. 如果 Windows 用户登录域 REALM 并转到 https://server.acme.com浏览器将根据名称 HTTP/server.acme.com 查找 SPN,从 Active Directory 请求 Kerberos 票证,并根据 SPNEGO 规范将其发送到授权 header 中的服务器
  4. 现在您只需使用内置的 Java Kerberos API 或使用某些第三方库(kerb4jspring-security-kerberos 等)验证此票证

如您所见,LDAP 未参与此身份验证流程(尽管它可用于下一步的授权)

关于java - Java Web 应用程序 SSO 的 Windows 集成身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49159075/

相关文章:

spring-boot - 无法与启用了 kerberos 和 SASL 的 kafka 生产者建立连接

java - 如何从 Java SWT 中的树中删除 TreeItem?

java - 将文本拆分为文本末尾有 "spaces"的段落?

java - 如何在 Java 中读取 LDAP 密码策略

java - LDAP 的 Java 客户端

java - Kerberos 错误 : GSSHeader did not find the right tag

java - 从异步任务获取空响应,响应代码为 200,这意味着成功

java - 聚合根中的重复值应该在领域层还是应用层进行检查?

java - 具有服务器大小限制的 LDAP 分页

java - 自动续订 Kerberos 票证不适用于 Java