我所遇到的这个问题已在本网站上多次讨论过,但大多数帖子都很陈旧。这是something similar我正在经历的事情。我正在使用WSO2 IS 5.2作为我的IdP,我有两个基于Java的Web应用程序托管在参与SSO的差异服务器上。每个webapp(SP)都实现了Spring-SAML扩展。单点登录完美运行,但单点登录仅部分有效。以下是测试用例:
所以最终的结果是我仍然在webapp1上有一个本地会话。如果我更改订单并从webapp1启动SLO,那么webapp1将被注销,webapp2的本地会话将继续存在。 WSO2服务器能够在SLO期间确定第二会话参与者,但是从Idp发送到第二会话参与者的HTTP请求没有Spring安全上下文。这将是无状态HTTP请求,因此不会有登录用户。这就是为什么我认为它失败了。
我发现了this次讨论。它大约2岁。这个问题有什么新东西吗?可能是我在WSO2或Spring-saml配置中错过的配置步骤。
以下是我的SP元数据的相关部分:
<md:SingleLogoutService Location="https://tpap10-wwwdev04.arbfile.org:443/webapp/saml/SingleLogout" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"/>
<md:SingleLogoutService Location="https://tpap10-wwwdev04.arbfile.org:443/webapp/saml/SingleLogout" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"/>
<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>
<md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
<md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
<md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName</md:NameIDFormat>
<md:AssertionConsumerService Location="https://tpap10-wwwdev04.arbfile.org:443/webapp/saml/SSO" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" isDefault="true" index="0"/>
<md:AssertionConsumerService Location="https://tpap10-wwwdev04.arbfile.org:443/webapp/saml/SSO" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" index="1"/>
SP上的一些相关的Spring-Saml配置:
<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.MetadataGenerator">
<property name="entityId" value="urn:webapp1:mycity"/>
<property name="entityBaseURL" value="https://wwwdev04.domain.org:443/webapp" />
<property name="extendedMetadata">
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
<!-- <property name="signMetadata" value="false"/> -->
<property name="idpDiscoveryEnabled" value="false"/>
</bean>
</property>
</bean>
</constructor-arg>
</bean>
答案 0 :(得分:1)
WSO2未正确实施SAML 2.0规范。该规范要求使用前端通道(=通过用户的浏览器)完成具有HTTP- *绑定的单一注销 - 这使得HTTP会话可用并允许Spring SAML正确终止它。我认为这个问题从未在WSO2中得到解决。
Spring SAML默认使用HttpSession存储用户的状态。这也是Spring SAML不支持单一注销与SOAP绑定开箱即用的原因。可以实现Spring Security会话的应用程序范围的存储,它可以独立于HttpSession而无效(因此可以解决WSO2的限制),但是默认情况下没有配置(我从未尝试过)。