【问题标题】:CAS for multiple clients of same name on multiple instances多个实例上同名的多个客户端的 CAS
【发布时间】:2019-12-03 07:48:37
【问题描述】:

我们有两个应用程序(abcdef)在 Struts2 中开发并与 CAS 服务器 3.2 集成以实现 SSO,部署在多个主机 (IP) 上。该部署架构图如下。 SSO 在以下部署中运行良好,没有问题。

我们部署了相同的两个 CAS 客户端(abcdef),具有多个实例(tomcat 端口为 80808081 ) 在同一主机上。请参阅下面的部署架构图。使用此 SSO 无法正常工作,单点登录工作正常,但当用户从 abc 应用程序注销时(它在 Host28081 端口上运行)然后会话过期请求将转到 def 应用程序(它在 Host28080 端口上运行)。此用户未从 def 应用程序(其在 Host28081 端口上运行)注销(会话未过期)。

可能这是我也不知道的愚蠢问题。如何解决这个问题。任何人都请帮助我。在以上两种情况下,URL 是相同的http://domain.in/abc/login.dohttp://domain.in/def/login.do

更新:

abc 中注销,仍然登录应用程序 def

看起来您正在尝试在这里实现某种集群?

是的。我想实现所有 CAS 客户端的单次注销。但在这里它没有发生。如上所述,注销命令正在发送到其他实例。

您是否在相同的节点之间进行会话复制 应用设置?

粘性会话。

您如何将来自客户端(或来自 CAS)的流量路由到 单个应用节点?

负载均衡器

【问题讨论】:

  • 这个问题很难回答。我建议您调试 CAS 服务器库以查看用户从应用程序注销时会发生什么。如果激活了单点注销过滤器,则用户从应用程序注销后 AFAIK,CAS 服务器将注销命令发送到所有其他应用程序。
  • @Spara,你说的是完全正确的。 CAS 服务器正在向所有应用程序(abc 和 def)发送注销命令。没关系。但是它在 8081 上向 abc 和 8080 上的 def 发送注销命令。但实际上它应该是 8081 上的 def。
  • 看起来你想在这里实现某种集群?那时我不会对所描述的行为感到惊讶。您如何将来自客户端(或来自 CAS)的流量路由到各个应用程序节点?您是否在同一应用程序设置的节点之间进行会话复制?我想如果您想要一个有效的单点注销,则需要将注销一个节点传播到其他节点。但这不是CAS服务器要解决的问题。也许只是尝试以更易读的方式描述您的问题...
  • 或者,您很可能使用sticky sessions。然后你可以尝试CAS documentation中描述的“前通道”。
  • @PetrBodnár 如何实现 SLO。我只是通过上面链接中的文档。但我没有完全理解。

标签: java spring struts2 cas single-logout


【解决方案1】:

关于所描述的负载平衡变体

首先,应该注意的是,是否有 2 个或 4 个节点组成客户端应用程序集群并不重要。所描述的问题无论如何都应该发生。因为 CAS 服务器始终只知道并使用给定客户端应用程序的一个地址 - 指向负载均衡器的地址。

问题出在哪里

如上所述,sticky sessions(会话亲和性)用于负载平衡。并且因为默认情况下 CAS 服务器使用所谓的“反向通道”进行单次注销 (SLO),它会向给定的客户端应用程序本身发出 (POST) 注销请求,不传递任何会话标识符( Java servlet 命名为JSESSIONID 的cookie)。因此,负载均衡器必须随机选择目标节点。

如何解决问题

一般有两种可能的解决方案

  1. 注意将“反向通道”注销请求传播到所有其他节点。这意味着 CAS 服务器或给定应用程序需要知道所有其他节点的地址 - 并将请求传递给它们。
  2. 使用所谓的“前通道”而不是“后通道”SLO。这意味着稍微修改的 (GET) 注销请求是由用户的浏览器而不是 CAS 服务器完成的。这意味着浏览器还将应用程序会话标识符与请求一起传递,并且负载均衡器这次可以选择正确的节点来使会话失效。使用 Apereo CAS,这就是告诉 CAS 应该在相应的 CAS 服务/客户端应用程序配置中使用前通道(参见他们的文档,例如6.1.x)并在应用程序中使用兼容的CAS client。李>

OP 的选项

您使用的是相当旧的 CAS 版本 3.2 - “前通道” SLO 似乎没有在 3.x 系列中实现。因此,选项如下:

  1. 坚持使用 CAS 3.x 并尝试以某种方式实施解决方案 1。

  2. 通过以下方式使用解决方案 2:

a) 尝试将一些较新的 CAS 版本(见下文)中的“前通道”SLO 合并到 CAS 3.x 中。

b) 升级到 CAS 4.x 并使用其“前通道”SLO,“版本 1”。在这个版本中,CAS 依赖于注销请求的同步链——应用程序被一个接一个地调用,每个应用程序都必须将浏览器重定向回 CAS,因此 CAS 可以重定向到其他应用程序链。

c) 升级到 CAS 5.x 或更高版本并使用其“前通道”SLO,“版本 2”。在此版本中,CAS 默认异步发出 Ajax 注销请求,这应该会导致更快、更稳定的 SLO。

进一步阅读

【讨论】:

  • 谢谢!我已经从 github repo 下载了 CAS 6 并尝试构建它,但得到了A problem occurred evaluating root project 'cas-server'. repository not found: F:\cas-6.0.0
  • 也谢谢你 :) 对于你的问题 - 你是否尝试构建 CAS from source?我还没有尝试过。通过克隆cas-overlay-template 将您的项目创建为 WAR 覆盖应该可以工作并且更容易......
  • 兼容jdk8吗?在doc中我发现它与11兼容。cas和cas-overlay-template有什么区别?
  • CAS 6 与 Java 8 不兼容,使用 Java 11 应该没问题。 cas是给整个CAS开发的,cas-overlay-template是给我们只是想用CAS的。你应该使用cas-overlay-template
  • 在你们的帮助下,我已经成功构建了cas-overlay-templatewar。你能帮我吗Where can I write my own authentication logic with database connection in CAS。不仅身份验证,我还需要集成其他逻辑(如审计等)。在 CAS 中为他们提供静态用户 ID 和密码。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2018-09-16
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多