当前位置: 首页 > 知识库问答 >
问题:

WSO2和Spring SAML单一注销问题

岳良策
2023-03-14

我遇到的问题已经在这个网站上讨论过几次了,但是大多数帖子都很旧了。这与我的经历相似。我使用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向Idp发送saml请求(通过浏览器)并返回saml响应
  9. 用户在webapp2本地注销,Idp会话终止
  10. IdP直接向webapp1(反向通道类型)发送注销请求
  11. 注销请求对webapp1失败(日志指示SamlStatusException:没有用户登录)

所以最终结果是我在webapp1上仍然有一个本地会话。如果我改变顺序并从webapp1启动SLO,那么webapp1将被注销,webapp2的本地会话将继续存在。WSO2服务器能够在SLO期间确定第二个会话参与者,但是从Idp发送到第二个会话参与者的HTTP请求没有Spring Security上下文。这将是一个无状态的HTTP请求,因此不会有登录用户。这就是我认为它失败的原因。

我发现了这个讨论。它大约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个答案

陈马鲁
2023-03-14

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

默认情况下,Spring SAML使用HttpSession存储用户状态。这也是Spring SAML不支持使用现成SOAP绑定进行单次注销的原因。可以实现Spring Security会话的应用程序范围存储,该存储可以独立于HttpSession而失效(因此可以绕过WSO2的限制),但这不是默认配置的(我从未尝试过)。

 类似资料:
  • 我正试图在我的java webapp中实现WSO2单点注销功能<我无法理解这件事: 然后我为第一个服务提供商(SP)调用注销,IdP使用SAML响应将其重定向到某个注销url,SP收到此请求并使超文本传输协议会话无效。 第二个SP也使用SAML响应从IdP获取请求,但此请求中的http会话是IdP和SP之间的会话,我需要使web浏览器和SP之间的会话无效。我如何获取此会话?

  • 我正在使用WSO2身份服务器5.0.0测试SAML SSO,其中两个PHP应用程序实例作为服务提供者(使用onelogin phpsaml)。我设法使单点登录工作,但现在我面临单点注销的问题。 当我从PHPApp1触发注销请求时,WSO2 IDP以注销响应进行响应,它似乎工作正常 WSO2 IDP触发对saml会话参与者的注销请求,在本例中是对PHPApp2的注销请求 PHPApp2处理注销请求,

  • 我有一个关于SAML 2.0和SLO的问题<在SLO过程中,作为Idp,我们启动注销并向SP发送注销请求,SP则返回注销响应。我们在IDP端部分注销,用户在IDP端注销,但是如果我返回SP站点,我仍然登录<这是IdP侧还是SP侧的问题?我的意思是SP应该终止会话并向IDP发送注销响应,还是IDP的任务是终止双方的会话? 谢啦

  • 问题内容: 我正在考虑为我的应用程序使用OAuth2。我尝试实现的体系结构如下: 我将拥有自己的(仅此)授权服务器 一些资源应用程序使用授权服务器验证对资源的访问 某些客户端应用程序(网络,移动设备)会将用户重定向到授权服务器进行身份验证,如果成功,则会在资源应用程序上使用api。 到目前为止,我已经成功实现了3个基本应用程序(1个身份验证服务器,1个资源服务器和1个客户端)之间的交互。我无法正常

  • 我有一个使用spring security和mvc框架开发的门户应用程序。此门户应用程序连接到IDP(使用Spring security和Spring saml开发)进行身份验证。如果用户身份验证成功,用户将被导航到主页,其中为外部应用程序提供了多个链接……当用户单击应用程序链接时,用户应成功导航到相应的应用程序,而无需质疑登录页面。 其他应用程序是使用strut和Spring Security开