25

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

在此处输入图像描述

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

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

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

4

5 回答 5

43

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

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

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

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

这种方法有一些现有的实现,例如CAS(中央身份验证服务)。请注意, Spring Security开箱即用地支持 CAS 。我建议您考虑使用现有的实现,因为编写自己的实现会很困难。我在回答中简化了一些事情,如果您不熟悉这个问题,那么很有可能会引入安全漏洞。

于 2013-08-08T09:26:14.717 回答
3

我会建议您查看 OAuth。它是一个很好的身份验证和授权协议,被包括 facebook、google、windows live 等几个大型组织使用。它可能有一个初始学习曲线,但它是一个生产级解决方案。

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

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

  • 阿帕奇琥珀(草案 22)
  • OAuth 的 Spring 安全性
  • API 授权服务器 (v2-31)
  • Restlet 框架(草案 30)
  • 阿帕奇 CXF

以下客户端 Java 库也可用:

  • 阿帕奇琥珀(草案 22)
  • 春季社交
  • OAuth 的 Spring 安全性
  • Restlet 框架(草案 30)

请参阅此处了解更多详情:

于 2013-08-16T14:40:37.137 回答
1

更大的问题是您如何实现单点登录。许多值得一提的开源甚至专有(IBM Tivoli)产品都提供跨域单点登录功能。这将是实现跨域 sso 的最简单和最好的方法。您可以配置在您选择的 sso 服务器中使用的 LDAP 服务器。

以open sso为例,这里有一篇配置跨域单点登录的文章 http://docs.oracle.com/cd/E19681-01/820-5816/aeabl/index.html

要在开放 sso 中配置 LDAP, http: //docs.oracle.com/cd/E19316-01/820-3886/ghtmw/index.html

此处以简洁的图表形式提供了有关该问题的参考 http://docs.oracle.com/cd/E19575-01/820-3746/gipjl/index.html

根据您使用的产品,您可以配置跨域单点登录。

有了这个,您的图表将如下所示,身份验证服务器是您与您选择的 sso 服务器交互的实用程序。

拥有一个与 sso 通信的身份验证服务器是一个合理的架构原则。我建议调用身份验证作为 REst 端点,可以通过 http 从不同的应用程序调用。

跨域单点登录

于 2013-08-14T21:56:46.163 回答
0

您不能使用 Rest Service 。

您可以使用我所说的引用 URL 身份验证 假设您有一个身份验证应用程序在 www.AAAA.com 上运行在您要进行身份验证的应用程序中,you could have a filter which looks for a authenticated cookie in its domain else redirect to www.AAAA.com for authentication

Successfull authentication,你可以pass the user profile information as encrypted GET / POST data back to the application

于 2013-08-08T08:39:37.320 回答
-1

由于我已经构建了一个 Java 应用程序,因此我一直在为它寻找 SSO 解决方案。我找到了一个免费的 Java SAML 连接器,您可以使用它在使用任何 Java 框架构建的基于 Java 的应用程序中实现 SSO。

这是它的链接 - https://plugins.miniorange.com/java-single-sign-on-sso-connector

于 2020-01-20T10:26:12.233 回答