我在SAML 2.0单次注销时遇到问题。
我有一个SAML2.0环境,其中有一个IdP(身份提供者(和一个充当SP(服务提供者(的web应用程序。
作为用户,我在用户代理(浏览器(中启动web应用程序会话。使用IdP对用户进行身份验证。
在不同的浏览器(在同一台客户端机器上运行(中,我在同一个web应用程序中以同一用户的身份启动另一个会话,即在SAML方面在同一SP中。
现在,我有两个独立的web应用程序会话,其中对同一用户进行身份验证。
然后,当我在其中一个浏览器中执行由IdP发起的单个注销时,IdP只发出一个注销请求,该请求将终止在该浏览器中运行的会话。IdP发出的注销请求的元素等于IdP在使用该浏览器(用户代理(发送给SP的断言的AuthnStatement的属性SessionIndex中发送的元素。
难道IdP实际上没有必要为所有打开的会话发送注销请求以实现真正的"单次注销"吗?
简单回答:SAML规范允许Single Logout(SLO(按照您想要的方式进行操作,但典型的实现并没有那么复杂。
根据SAML配置文件规范,第4.4节(单一注销配置文件(:
主体向身份提供程序进行身份验证后认证实体可以与主体建立会话(通常通过cookie、URL重写或其他方式具体实施方式(。身份提供者随后可以向服务提供商或其他依赖方发出断言,基于关于此身份验证事件;依赖方可以使用此与校长建立自己的会议。在这种情况下身份提供程序可以充当会话授权和依赖各方作为会议参与者。
如果SLO序列由会话参与者之一发起,那么整个讨论将毫无意义。规范要求会话参与者通过身份提供者最初发送给会话参与者的唯一ID(又名会话索引(来识别正在终止的"共享"会话。根据规范的要求,此ID在SP会话#1和SP会话#2中会有所不同。
但是当SLO序列由IdP启动时,您的场景是可能的。第4.4.4.1节介绍了<LogoutRequest>
:的发布和处理规则
如果请求者是会话参与者,则必须至少包括请求中的一个CCD_ 2元素。[…]如果请求者是则其可省略任何此类表示委托人的所有适用会话
翻译:如果您能以某种方式告诉IdP在没有<SessionIndex>
的情况下发出<LogoutRequest>
,并且您的SP足够复杂,能够正确解释此类请求,并且P可以通过其后端终止特定用户的所有会话,那么您就赢了。
事实上,上述条件的结合是一个非常高的要求。开箱即用,大多数IdP在没有<SessionIndex>
的情况下不会发布<LogoutRequest>
。极少数SP甚至会麻烦实现SLO,如果没有<SessionIndex>
,它们将不会接受请求。在极少数情况下,您能够找到正确的<LogoutRequest>
,而SP不会因此而窒息,如果SP能够正确识别所有由IdP启动的会话,并能够通过后端终止它们,您将非常非常幸运。