Loggt man sich mit einem Shibboleth-Account aus, so wird die zugehörige Session des SP nicht beendet. So kann man sich erneut einloggen, auch wenn man sich zusätzlich am IdP abgemeldet hat.
Reproduzierbarkeit
Kan man schön beobachten auf der Session Seite des SP: Shibboleth.sso/Session - diese wird auch nach Logout nicht beendet.
Hier reicht es beim Logout einmal über /Shibboleth.sso/Logout?return=.. zu gehen. Ich hab das lokal bei uns erstmal so gelöst, ggf. könnte man das aber hier auch mal generalisieren und für die einzelnen Auth-Plugins eine logout() Methode zur Verfügung stellen oder so.
diff --git a/public/logout.php b/public/logout.phpindex a4064ded7f..299d74b74a 100644--- a/public/logout.php+++ b/public/logout.php@@ -31,6 +31,7 @@ require_once 'lib/messaging.inc.php'; //nur wenn wir angemeldet sind sollten wir dies tun! if ($auth->auth["uid"]!="nobody") { $my_messaging_settings = $GLOBALS['user']->cfg->MESSAGING_SETTINGS; //Wenn Option dafuer gewaehlt, alle ungelsesenen Nachrichten als gelesen speichern@@ -48,6 +49,10 @@ if ($auth->auth["uid"]!="nobody") { $casauth = StudipAuthAbstract::GetInstance('cas'); $docaslogout = true; }++ // Shibboleth logout+ $do_shib_logout = $auth->auth["auth_plugin"] == "shib";+ //Logout aus dem Sessionmanagement $auth->logout(); $sess->delete();@@ -67,4 +72,11 @@ if ($auth->auth["uid"]!="nobody") { page_close(); }-header("Location:" . URLHelper::getURL("index.php?logout=true&set_language=$_language&set_contrast=$contrast"));+$location = $GLOBALS['ABSOLUTE_URI_STUDIP'] . URLHelper::getURL("index.php?logout=true&set_language=$_language&set_contrast=$contrast");++if ($do_shib_logout) {+ $location = URLHelper::getLink('/Shibboleth.sso/Logout', ['return' => $location]);+}++header("Location:" . $location);
Es gibt eine logout()-Methode - allerdings steht in public/logout.php, daß die nur aufgerufen wird, wenn der Name das Auth-Plugins "cas" ist. Das ist der Kern des Problems hier. Und der Code, der den eigentlichen Logout ausführt, gehört dann natürlich in das SSO-Plugin.
Ich habe in !3345 (merged) mal einen Vorschlag für eine generische Lösung gemacht. Für Shibboleth braucht's vermutlich noch eine spezielle URL, an die Request gehen soll? Das Beispiel von Philipp ist ja leider zu speziell, um das umsetzen zu können.
Ist das denn als BIEST auch immer noch okay? Ich habe die abstrakte Klasse bewusst um eine Methode erweitern, die man überschreiben kann, aber nicht muss (also keine abstrakte Methode). Dadurch sollte sich das ja portieren lassen.