【发布时间】:2017-06-10 19:52:42
【问题描述】:
我遇到的这个问题已经在这个网站上讨论过好几次了,但是大多数帖子都很老了。这是我正在经历的something similar。我使用 WSO2 IS 5.2 作为我的 IdP,并且我有 2 个基于 Java 的 Web 应用程序托管在参与 SSO 的不同服务器上。每个 webapp (SP) 都实现了 Spring-SAML 扩展。单点登录完美运行,但单点注销仅部分有效。这是测试用例:
- 访问 webapp1 上的安全资源
- 显示来自 Idp (WSO2) 的登录页面并且用户登录
- 提供来自 webapp1 的安全资源
- 访问 webapp2 上的安全资源
- SAML 请求发送到 Idp,Idp 响应并且用户通过身份验证
- 提供来自 webapp2 的安全资源,结束 SSO
- 从 webapp2 发起单次注销
- Webapp2 向 Idp 发送 saml 请求(通过浏览器)并返回 saml 响应
- 用户在 webapp2 上本地注销并且 Idp 会话终止
- IdP 直接向 webapp1 发送注销请求(反向通道类型)
- 对 webapp1 的注销请求失败(日志显示 SamlStatusException: 没有用户登录)
所以最终结果是我在 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>
【问题讨论】:
标签: spring-security saml-2.0 wso2is spring-saml