【问题标题】:Integrating Java Web App with SAML SSO将 Java Web 应用程序与 SAML SSO 集成
【发布时间】:2015-01-23 21:13:54
【问题描述】:

我有一个 Restful Java Web 应用程序,它将被部署到许多不同的环境(我无法控制),这些环境将使用 SAML 2.0 SSO 解决方案。

我的应用程序(我认为是“服务提供者”)需要存储用户生成的状态,并使用内部业务逻辑来确定允许哪些用户查看或更新其他用户的数据。为了使它起作用,我们需要知道用户是谁,以及用户属于哪些组。但是我如何获得这些信息呢?

理想情况下,我的 Web 应用程序将与 SSO 无关,并且会在 http 请求中查找一些可配置的键标头以获取此信息,例如请求中可以解析的 SAML 令牌,或者可能是我的“服务提供商”特定的一些自定义标头。

非常感谢

【问题讨论】:

  • 在 RESTful SSO 中,会话 cookie 通常不用于对用户进行身份验证吗?
  • 我会研究 Spring Security 或 Apache Shiro,两者都可以包装 Web 上下文以提供各种身份验证和用户存储机制。

标签: java rest single-sign-on saml


【解决方案1】:

您是对的,您的应用程序是服务提供者,您将有一个外部身份提供者 (IdP) 进行身份验证。

基本上,您需要向 IdP 发出身份验证请求(通过前通道 HTTP POST 或后通道 SOAP/无论它们支持什么),并使用 IdP 的 authenticationResponse 来决定他们是否是他们所说的人.作为一项规则,您应该能够从 authnResponse 获取主题主体(即用户名)和任何组成员身份,但具体如何工作将取决于 IdP 的配置。

在您执行此操作之前,您需要与 IdP 交换 SAML 元数据(这通常是向 IdP 注册为 SP 的一部分),这会为双方提供诸如用于签名和验证请求的公共 X509 证书之类的东西。

有一个很好的用于 SAML SP 支持的 spring 库,http://docs.spring.io/autorepo/docs/spring-security-saml/1.0.x-SNAPSHOT/reference/htmlsingle

【讨论】:

    【解决方案2】:

    您可以在 Java Web 应用程序前面运行反向代理来处理 SSO 协议部分并将用户身份信息中继到 HTTP 标头中的应用程序;对于 SAML 2.0,有 mod_auth_mellon:https://github.com/UNINETT/mod_auth_mellon

    【讨论】:

    • 谢谢汉斯 - 你为我指明了正确的方向。使用某种代理应该允许我在令牌和 HTTP 标头之间进行映射。这里有一个 OpenAM 的参考:stackoverflow.com/questions/16414460/…
    【解决方案3】:

    如果这是在 Java 中完成并在 web 容器(Tomcat、JBoss 等)上运行,那么代理可以实现为 web 身份验证 (servlet) 过滤器(添加到 web.xml)。用户通常来自 SAML Auth 响应的 或来自匹配用户 ID 属性(uid、电子邮件等)的 。此用户应根据 Web 应用程序的身份存储库(可能是 LDAP、数据库等)和计算的相应组进行验证。考虑在 Subject 中使用 java Principal(用于用户和组),而不是为经过身份验证的用户使用任意标头或自定义表示。 然后过滤器可以在 Subject.doAs() 中运行过滤器链的其余部分。这样,可以使用 Subject.getSubject() 在下游代码中的任何位置查找 Subject

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2023-03-23
      • 2018-04-04
      相关资源
      最近更新 更多