我们正在跨多个应用程序实施单点登录[SSO],这些应用程序托管在不同的域和不同的服务器上。
现在如图所示,我们正在引入一个Authenticate Server,它实际上与LDAP交互并对用户进行身份验证。将用于/与Authenticate Server通信的应用程序托管在不同的服务器和域之间。
对于SSO,我不能使用会话变量,因为有不同的服务器和不同的应用程序,不同的域,域级cookie /会话变量没有帮助。
我正在寻找一个更好的解决方案,可用于跨越它们的SSO。任何已证实的实施都存在?如果是这样,请发布或指出我正确的方向。
答案 0 :(得分:38)
您可以通过在auth服务器上进行所有登录来实现此目的。其他应用程序可以通过反向通道与auth服务器通信。一般原则是这样的:
现在这是SSO位的来源:
此方法有一些现有的实现,例如CAS(中央身份验证服务)。请注意,Spring Security中的CAS支持开箱即用。我建议你看看使用现有的实现,因为编写自己的实现将很难。我在答案中简化了一些内容,如果您对此不熟悉,那么引入安全漏洞的可能性很大。
答案 1 :(得分:3)
我会建议您查看OAuth。这是一个很好的认证和授权协议,由几个大型组织使用,包括Facebook,谷歌,Windows Live和其他。它可能有一个初步的学习曲线,但它是一个生产级解决方案。
它还有Java,Ruby,PHP和一系列其他编程语言的库。
例如,以下服务器端实现可用于Java。
以下客户端Java库也可用:
请参阅此处了解更多详情:
答案 2 :(得分:1)
更大的问题是如何实施单点登录。许多开源甚至专有(IBM Tivoli)产品都值得他们提供跨域单点登录功能。这将是实现跨域sso的最简单,最好的方法。您可以配置在所选的sso服务器中使用的LDAP服务器。
以开放式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服务器是一种健全的体系结构原则。我建议调用验证作为REst端点,可以通过不同应用程序的http来调用。
答案 3 :(得分:0)
您无法使用Rest Service。
您可以使用我称之为 Refferer 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