是否应该多次接受相同的SAML响应两次?

时间:2014-03-14 22:13:52

标签: single-sign-on soa saml opensaml

SAML联合软件是否应该接受相同的SAML响应,只要它在允许的SAML令牌生存期内?

简单来说: IDP(识别提供商)发出SAML响应,然后SP(服务提供商)接受/处理它。可以在首次使用后立即重复使用相同的未修改的SAML响应吗?鉴于SAML发布时间戳在允许的范围内。

安全方面,将SAML令牌(响应)限制为仅一次使用是有意义的,这样即使它被一个中间人" - 它不能重复使用。但是为了实现这一点,软件需要在某处存储有关SAML响应的一些信息:序列号,整个事物的哈希值?

请提供一些链接,说明可能的解释和/或实施示例。

谢谢! 亚历克斯。

2 个答案:

答案 0 :(得分:9)

SAML 2.0规范提供了另一种方法来防止重放攻击,这并不意味着在数据库中存储断言的ID。

  • SP发送ID =" X"并将此ID存储在会话中。
  • IDP对用户进行身份验证并发回一个ID =" Y"和一个InResponseTo =" X" (通常也存在于SubjectConfirmationData中的断言中)。
  • SP获取响应并检查所有InResponseTo值是否与会话中的值匹配。如果没有,SP拒绝回复。
  • SP在会话中清除ID,因此无法重放响应。在理想情况下,SP应在收到响应后立即清除会话中的ID。

这项检查确实使重播攻击变得复杂,因为攻击者还需要拥有SP的会话cookie(即使在这种情况下,它已经过了游戏......)。 签署整个回复也是一种很好的做法。

显然,此方法仅在SP启动的方案中有效。

答案 1 :(得分:5)

安全性是否有意义?当然。事实上你可以使用" xs:ID"断言的一部分来帮助你(我公司的软件确实如此)。

来自CORE的第9页:

  

xs:ID简单类型用于声明SAML标识符   断言,请求和响应。声明为值的值   xs:本规范中的ID必须满足以下属性   除了xs:ID类型本身的定义强加的那些:

     

•任何分配标识符的一方必须确保存在   该方或任何其他方的概率可以忽略不计   意外地将相同的标识符分配给不同的数据对象。

     

•如果数据对象声明它具有特定标识符,   必须有一个这样的声明。

我们从断言中抓取该ID,并将其放入具有not-after时间的数组中,然后在该时间到期后将其丢弃。这样就无法重播相同的断言。

在其他软件(特别是本土的东西)中,这完全由受众限制的Not-Before和Not-On-Or-After部分管理。由于某些软件仅依赖于这些值,因此建议的方法是将此期间设置为合理的短期。在完美的世界中,每个人都在使用时间服务器,他们的时钟偏差不超过几秒钟。一分钟之前,一分钟发布时间应该远远不够。虽然没有那么多"安全"在这里,它可以被管理"。

相关问题