使用 Java 跨不同域的单点登录 [SSO]

我们正在跨多个应用程序实现单点登录 [SSO],这些应用程序托管在不同的域和不同的服务器上。

enter image description here

现在如图所示,我们正在引入一个身份验证服务器,它实际上与LDAP交互并对用户进行身份验证。将使用/与身份验证服务器通信的应用程序托管在不同的服务器和域中。

对于SSO,我不能使用会话变量,因为有不同的服务器和不同的应用程序,不同的域,域级cookie/会话变量没有帮助。

我正在寻找一个更好的解决方案,可用于跨它们的SSO。是否有任何已演示的实现存在?如果是这样,请发布它或为我指出正确的方向。


答案 1

您可以通过将所有登录都放在身份验证服务器上来实现此目的。其他应用程序可以通过反向通道与身份验证服务器进行通信。一般原理是这样的:

  1. 用户访问应用程序 1。
  2. 应用程序 1 需要用户登录,因此它通过后通道向身份验证服务器发送令牌。然后,应用程序 1 将用户重定向到身份验证服务器上的登录页面,并将令牌作为请求上的参数。
  3. 用户登录到身份验证服务器。身份验证服务器设置一个 cookie,将令牌标记为已通过身份验证,并将用户详细信息与其关联。然后,身份验证服务器将用户重定向回应用程序 1。
  4. 应用程序 1 从用户获取请求,并通过反向通道调用身份验证服务器以检查令牌是否正常。身份验证服务器响应用户详细信息。
  5. 应用程序 1 现在知道用户已获得授权,并具有一些基本的用户详细信息。

现在,这就是 SSO 位的用武之地:

  1. 用户访问应用程序 2。
  2. 应用程序 2 需要用户登录,因此它通过反向通道向身份验证服务器发送令牌。然后,应用程序 2 将用户重定向到身份验证服务器上的登录页面,并将令牌作为请求上的参数。
  3. 身份验证服务器看到有一个有效的登录cookie,因此它可以告诉用户已经通过身份验证,并知道他们是谁。身份验证服务器将令牌标记为已通过身份验证,并将用户详细信息与其关联。然后,身份验证服务器将用户重定向回应用程序 2。
  4. 应用程序 2 从用户获取请求,并通过反向通道调用 auth 服务器以检查令牌是否正常。Auth 服务器响应用户详细信息。
  5. 应用程序 2 现在知道用户已获得授权,并具有一些基本的用户详细信息。

此方法有一些现有的实现,例如 CAS(中央身份验证服务)。请注意,CAS 在 Spring Security 中是开箱即用的。我建议你考虑使用现有的实现,因为编写自己的实现会很困难。我在答案中简化了一些事情,如果你是新手,有很多引入安全漏洞的可能性。


答案 2

我会建议你看看OAuth。这是一个很好的Authentaiton和授权协议,被几个大型组织使用,包括Facebook,google,windows live等。它可能具有初始学习曲线,但它是生产级解决方案。

它还具有Java,Ruby,PHP和一系列其他编程语言的库。

例如,以下服务器端实现可用于 Java。

  • 阿帕奇琥珀(草案22)
  • 适用于 OAuth 的 Spring Security
  • API 授权服务器 (v2-31)
  • Restlet 框架(草案 30)
  • Apache CXF

以下客户端 Java 库也可用:

  • 阿帕奇琥珀(草案22)
  • 春季社交
  • 适用于 OAuth 的 Spring Security
  • Restlet 框架(草案 30)

有关更多详细信息,请参阅此处:


推荐