使用Java在不同域上单一登录

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

在此处输入图像描述

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

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

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

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

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

现在这是SSO位的来源:

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

该方法存在一些现有的实现,例如CAS (中央认证服务)。 请注意, Spring Security支持开箱即用的CAS。 我建议你看看使用现有的实现,因为编写自己的实现将很难。 我在答案中简化了一些内容,如果你是新手,那么引入安全漏洞的可能性很大。

我会建议你查看OAuth。 这是一个很好的Authenticaiton和授权协议,由几个大型组织使用,包括Facebook,谷歌,Windows Live和其他。 它可能有一个初步的学习曲线,但它是一个生产级解决方案。

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

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

  • Apache Amber(草案22)
  • OAuth的Spring Security
  • Apis授权服务器(v2-31)
  • Restlet框架(草案30)
  • Apache CXF

以下客户端Java库也可用:

  • Apache Amber(草案22)
  • spring社交
  • OAuth的Spring Security
  • Restlet框架(草案30)

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

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

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

要在open 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

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

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

拥有与sso通信的auth服务器是一种健全的架构原则。 我建议调用validation作为REst端点,可以通过不同应用程序的http调用。

跨域单点登录

您不能使用Rest Service。

您可以使用我称之为Refferer Url身份validation假设您在www.AAAA.com上运行身份validation应用程序在要进行身份validation的应用程序中, 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