java - 使用 Java 跨不同域的单点登录 [SSO]

标签 java authentication servlets single-sign-on multiple-domains

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

enter image description here

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

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

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

最佳答案

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

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

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

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

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

关于java - 使用 Java 跨不同域的单点登录 [SSO],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18121278/

相关文章:

java - 多模块(pom)和java模块系统的区别

java - 如何从 servlet 设置或访问 Tomcat 中的 JspCompilationContext?

c# - 使用自定义 ClientCredentials : What is the clientCredentialType to use? 的 WCF 身份验证

java - JSP 使用过滤器写入响应

java - Java 中是否有 SQLite 的驱动程序?

Java:如何使用第一个完成的多个线程的结果?

c# - 如何以编程方式登录到 ASP.NET Identity 2?

php - CActiveForm 及其行为没有名为 "getErrors"的方法或闭包。

Java Web 应用程序 : Why is getContextPath empty?

java - 尽管事先已填充,文本区域和其他输入仍返回 null