2

我开始为我们为同一个客户端制作并仍在维护的 3 个不同的 web 应用程序开发SSO解决方案。

问题是,所有 3 个都通过第四个单独的应用程序将他们的用户和登录信息存储在同一个地方,该应用程序只提供基本的 restful api 服务。这基本上意味着当一个人尝试登录时,我们实际上会调用其余服务来询问此用户名和密码是否正确。

在某种程度上,这第四个宁静的东西已经完成了我们需要的至少一半的工作。

我们现在需要一种方法让用户登录到 webapp A,然后点击链接(或简单地输入其 url)到 webapp B(或简单地输入其 url)并到达已登录的位置(反之亦然)。

我已经阅读了很多关于CASopenID甚至oauth的内容,但我并不能真正下定决心。这种模式是中心化的吗?去中心化?

我的一万英尺视图表明我只需要以某种方式将这个“缺失的功能”添加到我们宁静的 api 服务器。

但是怎么做?

ps:这3个是完全分开的。部署在不同的机器上(其中两台在 glassfish 上运行,另一台在 tomcat 上运行)。不同的域也是。

pps:它们都是 spring 驱动的 webapps(因此它们使用spring-security

ppps:截至今天,还有其他 webapps 使用我们的 restul api(非 spring,非 java)。这个 sso 解决方案可能也必须准备好处理这些问题。

4

2 回答 2

4

是的,听起来您需要一个“真正的”单点登录系统,而不仅仅是一个集中的凭证存储库。正如您所提到的,有几种选择:

  1. OpenId - 更适合您希望允许用户使用由第三方维护的凭据登录您的系统的 Internet 类型的应用程序。Stackoverflow 就是一个典型的例子。您可以使用您的谷歌帐户等登录。

  2. Oauth 提供伪身份验证和 sso - 而 OpenId 说“这是用户 x” oauth 说“这个用户可以访问 x 的信息”......所以你可以假设用户是 x。

  3. CASCloudsealOpenAM等都提供真正的单点登录,适用于 Intranet 或 Extranet 环境。CAS 和 Cloudseal 对 Spring 的支持特别好。

于 2012-04-16T14:52:57.117 回答
0
  • 受信任的站点(白名单中的依赖方 (RP) - 在您的情况下为应用程序 a、b、c)向主站点(提供者 - “第四个单独的应用程序”)发出请求(重定向),并带有返回 url。
  • 主站点确保请求(returnURL)来自域白名单
  • 登录用户(如果未登录,则显示登录表单),将用户标记为登录数据库并将临时令牌添加到用户数据库。
  • 主站点返回(重定向)到带有令牌的 RP。
  • RP 使用令牌查看数据库,记录用户并删除令牌。

SSOff 也很简单:只需将用户数据库中的每个请求都检查到布尔记录(userLogged)中。没有重定向。注销时只需将记录 (userLogged) 更改为 false,每个站点都会知道。

于 2012-05-04T15:03:42.270 回答