2017-01-25 6 views
0

내가 겪고있는 문제는이 사이트에서 여러 번 논의되었지만 대부분의 게시물은 상당히 오래된 내용입니다. 여기에 something similar이 있습니다. 내 IdP로 WSO2 IS 5.2를 사용 중이며 SSO에 참여하는 차이 서버에서 호스팅되는 2 개의 Java 기반 웹 응용 프로그램이 있습니다. 각 webapp (SP)는 Spring-SAML 확장을 구현했습니다. Single Sign-On은 완벽하게 작동하지만 Single Logout은 부분적으로 만 작동합니다. 다음은 테스트 케이스이다 : webapp1에WSO2 및 스프링 SAML 단일 로그 아웃 문제

  1. 액세스 보안 자원
  2. IDP (WSO2)에서 로그인 페이지 제시하고 사용자가 로그인 webapp2에
  3. 액세스 보안 리소스를 제시 webapp1에서
  4. 안전 자원에
  5. SAML 요청 IDP에 전송되어이 IDP 응답하여 제공되는 사용자 webapp2에서
  6. 시큐어 리소스를 인증 된 최종 SSO
  7. 에서 itiate 하나의 IDP에 (브라우저를 통해) SAML 요청을 보내 webapp2
  8. Webapp2에서 로그 아웃 및 SAML 응답은
  9. 사용자가 webapp2에 로컬로 로그 오프 및 IDP 세션이 IDP는 직접 webapp1에 로그 아웃 요청을 전송
  10. 을 종료 반환 (백 채널 형)
  11. 로그 아웃 요청 (로그 SamlStatusException를 나타냅니다 : 사용자가 로그인하지 않은) webapp1에 실패

그래서 최종 결과는 아직도 webapp1의 로컬 세션을 가지고있다. 주문을 변경하고 webapp1에서 SLO를 시작하면 webapp1이 로그 아웃되고 webapp2의 로컬 세션이 계속 존재하게됩니다. WSO2 서버는 SLO 중에 두 번째 세션 참가자를 확인할 수 있지만 Idp에서 두 번째 세션 참가자에게 전송 된 HTTP 요청에는 Spring 보안 컨텍스트가 없습니다. 이것은 stateless HTTP 요청이므로 로그인 한 사용자는 없을 것입니다. 이것이 내가 실패하고 있다고 생각하는 이유입니다.

나는 this 토론을 발견했다. 그것의 약 2 세. 이 문제에 새로운 점이 있습니까? 아마 WSO2 나 Spring-saml config에서 설정 단계를 놓친 것일 수 있습니다. 여기

내 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에서 일부 관련 스프링 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

WSO2 올바르게 SAML 2.0 사양을 구현되지 않았습니다. 이 사양에서는 HTTP- * 바인딩을 사용하는 단일 로그 아웃이 HTTP 세션을 사용 가능하게 만들고 프론트 엔드 채널 (= 사용자의 브라우저를 통해)을 사용하여 완료되어야하며 스프링 SAML이 올바르게 종료하도록 허용합니다. 나는이 문제가 WSO2에서 해결 된 적이 없다고 생각한다.

스프링 SAML은 기본적으로 사용자의 상태를 저장하기 위해 HttpSession을 사용합니다. 이것은 또한 Spring SAML이 SOAP 바인딩을 사용하는 단일 로그 아웃을 지원하지 않는 이유이기도합니다. HttpSession과 독립적으로 무효화 될 수있는 (따라서 WSO2의 한계를 극복 할 수있는) 스프링 보안 세션의 애플리케이션 차원의 스토리지를 구현하는 것이 가능할 것이다. 그러나 이것은 디폴트로 설정되지 않는다.

+0

안녕하세요 블라디미르, 나는 당신이 봄에 전문가라는 것을 알고 있습니다. 내 문제를 도와 줄 수있어? – bob9123