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

Ale*_*vik 8 soa saml single-sign-on opensaml

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

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

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

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

谢谢!亚历克斯.

sk_*_*sk_ 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启动的方案中有效.

  • 这对我们有用,但我们使用所谓的"未经请求的SAML响应" - IPD启动交易.不管怎么说,还是要谢谢你! (2认同)

And*_* K. 5

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

来自CORE的第9页:

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

•任何分配标识符的一方必须确保该方或任何其他方不小心将相同的标识符分配给不同的数据对象的可能性微乎其微.

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

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

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