如何/应该在SAML中的服务提供商和实际应用程序之间进行通信?

时间:2017-01-20 11:54:33

标签: spring-security single-sign-on saml spring-saml shibboleth

据我所知,IDP和SP之间的通信在标准中有明确定义。我想知道在独立SP和实际应用程序之间进行自定义通信的方法是什么。

我认为标准方式存在,而不是重新发明轮子我自己。但即便spring-saml security也只谈及自定义机制"没有说出它是什么。

有人能向我指出正确的方向吗?我已经搜索过,但我很惊讶它没有写在任何地方的博客,教程等等。甚至在Shibboleth / Gluu文档中,这部分也不知何故。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

问题基本上归结为“如何在受信任的网络中部署的两个应用程序可以安全地相互通信,以便交换有关用户的安全信息”。这是SAML针对通过不受信任的网络进行通信的应用程序所解决的相同问题,并且由于认证点(SP)和应用程序都在同一实体的控制之下而变得更容易=例如,它是更容易使用symetric加密。 SP原则上可以使用前端通道(=通过Web浏览器)或后端通道(=通过网络直接相互之间)与应用程序通信。

有不同的方式来执行通信(使用一个,另一个或两个通道),大多数可以使用一些可用的安全产品来实现。以下是一些想法:

SP和应用程序共享同一个域(=用户的Web浏览器在共享cookie的URL上访问它们)

  • 您可以将SP配置为存储Cookie - 一条信息,包括例如UID和经过身份验证的用户到期后,可以使用SP和应用程序都知道的共享密钥对cookie进行加密。这是使用的方法,例如由OpenAM或带有共享域加密cookie的Wildfly。
  • 该方法的替代方案是将关于经认证的用户的信息从SP发送到应用程序,例如,作为加密的HTTP POST参数 - 与SAML类似的方法,更基本。
  • 可以通过使用另一个安全共享存储来增强相同的方法 - 例如数据库并仅发送对记录的引用(例如,唯一的秘密会话ID)

SP可用作应用程序的HTTP代理

  • 在这种情况下,您可以将身份验证信息作为HTTP标头传递给应用程序,您必须确保通过SP是访问应用程序的唯一方法。这仅在SP是例如SP的一部分时才是实用的。负载均衡器(例如Apache / Nginx插件)。

SP和应用程序可以使用标准身份验证机制来传递身份验证数据

  • 你可以使用例如Kerberos(无论如何基于共享密钥加密)或OAuth

每个选项可能具有不同的攻击媒介和可能的漏洞。

我的观点是,将SAML功能直接添加到应用程序中,使用支持SAML的HTTP代理,或处理SP与应用程序(例如OpenAM)之间的最后一英里身份验证的标准产品是最好的方法。实现自定义安全机制似乎很容易,但是存在很多错误,导致整个解决方案容易受到攻击。