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

Red*_*ddy 22 java authentication servlets multiple-domains single-sign-on

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

在此输入图像描述

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

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

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

Qwe*_*rky 39

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

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

现在这是SSO位的来源:

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

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

  • @Reddy - 我创建了使用CAS和Spring安全性的SSO站点.我从来没有推出自己的SSO实现,也不会尝试. (4认同)