WSO2和Spring SAML单点注销问题

时间:2017-01-25 15:05:20

标签: spring-security saml-2.0 wso2is spring-saml

我所遇到的这个问题已在本网站上多次讨论过,但大多数帖子都很陈旧。这是something similar我正在经历的事情。我正在使用WSO2 IS 5.2作为我的IdP,我有两个基于Java的Web应用程序托管在参与SSO的差异服务器上。每个webapp(SP)都实现了Spring-SAML扩展。单点登录完美运行,但单点登录仅部分有效。以下是测试用例:

  1. 访问webapp1上的安全资源
  2. 显示Idp(WSO2)的登录页面,用户登录
  3. 提供来自webapp1的安全资源
  4. 访问webapp2上的安全资源
  5. SAML请求发送到Idp,Idp响应并且用户已通过身份验证
  6. 显示来自webapp2的安全资源,结束SSO
  7. 从webapp2启动单点注销
  8. Webapp2发送saml请求(通过浏览器)到Idp并返回saml响应
  9. 用户在webapp2上本地注销,Idp会话终止
  10. IdP直接向webapp1发送退出请求(反向通道类型)
  11. logout请求无法通过webapp1(日志表示SamlStatusException:没有用户登录)
  12. 所以最终的结果是我仍然在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>
    

1 个答案:

答案 0 :(得分:1)

WSO2未正确实施SAML 2.0规范。该规范要求使用前端通道(=通过用户的浏览器)完成具有HTTP- *绑定的单一注销 - 这使得HTTP会话可用并允许Spring SAML正确终止它。我认为这个问题从未在WSO2中得到解决。

Spring SAML默认使用HttpSession存储用户的状态。这也是Spring SAML不支持单一注销与SOAP绑定开箱即用的原因。可以实现Spring Security会话的应用程序范围的存储,它可以独立于HttpSession而无效(因此可以解决WSO2的限制),但是默认情况下没有配置(我从未尝试过)。