0

我遇到了 SAML 2.0 single logout的问题。

我有一个 SAML 2.0 环境,其中有一个 IdP(身份提供者)和一个充当 SP(服务提供者)的 Web 应用程序。

作为用户,我在用户代理(浏览器)中启动 Web 应用程序会话。使用 IdP 对用户进行身份验证。

在不同的浏览器中(在同一台客户端机器上运行),我在同一个 Web 应用程序中以同一个用户的身份启动另一个会话,即在 SAML 方面的同一个 SP 中。

现在我有两个独立的 Web 应用程序会话,其中对同一用户进行身份验证。

然后,当我在其中一个浏览器中执行由 IdP 发起的单次注销时,IdP 仅发出一个注销请求,该请求终止在该浏览器中运行的会话。IdP 发出的注销请求的元素等于 IdP 在使用该浏览器(用户代理)发送到 SP 的断言的 AuthnStatement 的属性 SessionIndex 中发送的元素。

IdP 是否真的有必要为所有打开的会话发送注销请求以实现真正的“单次注销”?

4

1 回答 1

0

简短回答:SAML 规范允许单点注销 (SLO) 以您想要的方式运行,但典型的实现并不那么复杂。

来自SAML 配置文件规范,第 4.4 节(单注销配置文件):

一旦主体向身份提供者进行了身份验证,身份验证实体就可以与主体建立会话(通常通过 cookie、URL 重写或其他一些特定于实现的方式)。身份提供者随后可以根据此身份验证事件向服务提供者或其他依赖方发出断言;依赖方可以使用它与委托人建立自己的会话。在这种情况下,身份提供者可以充当会话权威,而依赖方可以充当会话参与者

如果 SLO 序列由会​​议参与者之一发起,那么整个讨论将毫无意义。该规范要求会话参与者通过身份提供者最初发送给会话参与者的唯一 ID(又名会话索引)来识别正在终止的“共享”会话。根据规范的要求,此 ID 在您的 SP 会话 #1 和 SP 会话 #2 中会有所不同。

...但是当 SLO 序列由 IdP 启动时,您的情况是可能的。第 4.4.4.1 节讨论了有关发行和处理的规则<LogoutRequest>

如果请求者是会话参与者,它必须在请求中包含至少一个<SessionIndex>元素。[...] 如果请求者是会话授权机构(或代表其行事),则它可以省略任何此类元素以指示终止委托人的所有适用会话

翻译:如果您能以某种方式告诉 IdP 发出<LogoutRequest>没有 a 的 a<SessionIndex> 并且您的 SP 足够复杂以正确解释此类请求,并且SP 可以通过其后端终止特定用户的所有会话,那么您就赢了。

实际上,上述条件的组合是一个非常高的要求。开箱即用,大多数 IdP 不会在<LogoutRequest>没有<SessionIndex>. 极少数甚至为实现 SLO 而烦恼的 SP 不会接受没有<SessionIndex>. 在极少数情况下,您将能够提出正确<LogoutRequest>且 SP 不会窒息,如果 SP 正确识别所有 IdP 发起的会话并且能够终止,您将非常非常幸运他们通过后端。

于 2020-03-24T00:47:20.767 回答