SAML 2.0 单次注销问题 - IdP 应如何终止在不同用户代理中运行的 SP 会话?

Posted

技术标签:

【中文标题】SAML 2.0 单次注销问题 - IdP 应如何终止在不同用户代理中运行的 SP 会话?【英文标题】:Issue with SAML 2.0 single logout - How should IdP terminate SP sessions running in different user agents? 【发布时间】:2020-07-01 13:58:15 【问题描述】:

我在使用 SAML 2.0 单次注销时遇到问题。

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

一旦委托人通过身份提供者的身份验证, 认证实体可以与委托人建立会话 (通常通过 cookie、URL 重写或其他方式 实现特定的手段)。身份提供者可能随后 向服务提供商或其他依赖方发出断言,基于 在此身份验证事件上;依赖方可以使用它来 与委托人建立自己的会话。在这种情况下, 身份提供者可以充当 会话授权 和依赖 各方作为会话参与者

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

...但是当 SLO 序列由 IdP 启动时,您的方案是可能的。第 4.4.4.1 节讨论了关于发布和处理<LogoutRequest> 的规则:

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

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

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

【讨论】:

以上是关于SAML 2.0 单次注销问题 - IdP 应如何终止在不同用户代理中运行的 SP 会话?的主要内容,如果未能解决你的问题,请参考以下文章

SAML SLO(单次注销)是不是从所有 SP(服务提供商)注销?

WSO2 和 Spring SAML 单次注销问题

使用 SAML 单次注销 (SLO) 调用注销 URL 后如何清除 Android 网络视图 cookie?

spring saml:LOGOUT 是如何处理的?是不是必须在 IDP 元数据 xml 中有注销端点?

Spring SAML 2.0 - 导入 IDP 的本地元数据 - MetadataProviderException

SAML 2.0 实例分析 idp向sp发送响应