4

我已经实现了对 SAML SSO 的支持,让我的应用程序使用 Spring Security SAML Extension 作为服务提供者。我能够将我的 SP 与不同的 IDP 集成。例如,我有HostA、HostB 和 HostC,所有这些都有我的应用程序的不同实例。我为每个主机指定了一个 SP 元数据文件,并将 AssertionConsumerServiceURL 设置为该主机的 URL(EX:https:HostA.com/myapp/saml/sso)。我将每个元数据文件添加到 IDP 并测试了所有这些文件,它工作正常。

但是,我的项目还通过为负载平衡配置 IBM HTTP Server 来支持高可用性。因此在这种情况下,HTTP 服务器会将主机(A、B、C)配置为用于负载平衡的主机,用户将使用 HTTP 服务器的 URL 访问我的应用程序:https:httpserver.com/myapp/

如果我定义了一个 SP 元数据文件并在 AssertionConsumerServiceURL( https://httpserver.com/saml/sso )中指定了 HTTP 服务器的 URL,并更改了我的实现以接受针对我的 HTTP 服务器的断言,结果会是什么这种情况:

  1. 用户访问将用户分派到 HostA 的 HTTPServer(幕后)
  2. 我在 HostA 中的 SP 应用程序向 IDP 发送身份验证请求。
  3. IDP 将响应发送回我的 httpserver: https://httpserver.com/saml/sso

HTTP 服务器是否会重定向到 HostA,使其如下所示: https ://HostA.com/saml/sso

谢谢。

4

1 回答 1

7

在负载均衡器后面以集群模式部署相同的应用程序实例时,您需要告知后端应用程序有关它们部署在后面的 HTTP 服务器 ( https://httpserver.com/myapp/ ) 上的公共 URL。您可以使用SAMLContextProviderLB(请参阅手册中的更多内容)来执行此操作。但是您似乎已经成功执行了这一步。

一旦您的 HTTP 服务器收到一个请求,它会将其转发到您的主机之一到 URL,例如https://HostA.com/saml/sso,并且通常还会提供原始 URL 作为 HTTP 标头。这SAMLContextProviderLB将使 SP 应用程序认为真正的 URL 是https://httpserver.com/saml/sso,这将使其通过与目标 URL 相关的所有 SAML 安全检查。

由于后端应用程序在其 HttpSessions 中存储状态,请确保执行以下操作之一:

  • 在 HTTP 服务器上启用粘性会话(以便相关请求始终定向到同一服务器
  • 确保跨集群复制 HTTP 会话
  • EmptyStorageFactory通过在 Spring 配置中包含 bean 来禁用对响应 ID 的检查(此选项也使 Single Logout 不可用)
于 2014-12-05T10:51:49.240 回答