2016-08-26 3 views
0

Die Multi-Tenant-SAML-Anwendung, an der ich arbeite, verwendet Spring-Security-SAML und enthält zwei Service Provider und einen IDP (Active Directory Federation Services). Der Entwickler, der SSO für diese Anwendung verwendet hat, entschied sich für eine Multi-Tenant-Anwendung, da es sich um eine Anwendung mit zwei verschiedenen Funktionen handelt - im Wesentlichen zwei Anwendungen in einem. Es ist so konzipiert, dass es in einem Browser mit zwei geöffneten Registerkarten verwendet werden kann, sodass eine Oberfläche auf der ersten Registerkarte und die andere auf der zweiten Registerkarte ausgeführt wird. Alles scheint richtig mit Ausnahme eines bestimmten Workflow zu arbeiten:Wie kann ich Global Logout in einer Multi-Tenant-SAML-Anwendung mit Spring-Security-Saml arbeiten?

  1. Öffnen Sie einen Browser, navigieren Sie zum ADFS Anmeldeseite, und melden Sie sich an, um die Anwendung mit dem ersten Service-Provider
  2. Öffnen Sie eine andere Registerkarte navigieren Sie zu dem ADFS Anmeldeseite, und wählen Sie den zweiten Dienstanbieter
  3. eine globale Logout Perform

die Protokolldatei Fehler wie diese enthält:

Message a598hd6ff68479a44c3495f7h4216aa not found in session 11cfm6ja982te14dxxul71iufg Received logout response is invalid InResponseToField in LogoutResponse doesn't correspond to sent message a598hd6ff68479a44c3495f7h4216aa

Ich vermute, dass dies mit der Tatsache zusammenhängt, dass derselbe JSESSIONID-Cookie zwischen den Tabs geteilt wird. Wenn sich also ein SP abmeldet, wird die zugehörige Sitzung beendet. Wenn der andere SP versucht, sich mit derselben Sitzung abzumelden, schlägt die Sitzung fehl, weil die Sitzung beendet ist. Kann mir bitte jemand helfen, dieses Problem zu lösen?

Antwort

1

Ich konnte schließlich dies richtig funktionieren, indem Sie in der Bean SecurityConnectLogoutHandler invalidateHttpSession auf false festlegen. Wenn sich der erste Dienstanbieter abmeldet, wird die Authentifizierung zwar weiterhin deaktiviert, die Sitzung bleibt jedoch bestehen. Wenn der zweite Dienstanbieter sich abmeldet, findet er die Sitzung und meldet sich erfolgreich ab. Dies sollte in Ordnung sein, da Jetty standardmäßig die Sitzung nach 30 Minuten Inaktivität abbricht. Hier ist die Bohne, die ich änderte:

// Logout handler terminating local session @Bean public SecurityContextLogoutHandler logoutHandler() { SecurityContextLogoutHandler logoutHandler = new SecurityContextLogoutHandler(); logoutHandler.setInvalidateHttpSession(false); logoutHandler.setClearAuthentication(true); return logoutHandler; }

Verwandte Themen