Liberty-Repository[8.5.5.4 oder höher]

Sitzungsmanagementendpunkt für OpenID Connect aufrufen

Mithilfe des Sitzungsmanagementendpunkts können OpenID-Connect-Relying-Partys den Anmeldestatus eines Benutzers eines bestimmten OpenID Connect-Providers (OP) bei gleichzeitig minimiertem Netzdatenverkehr überwachen. Mit dem Sitzungsmanagementendpunkt kann eine Relying Party (RP) einen Benutzer abmelden, der sich beim OpenID Connect-Provider abgemeldet hat.

Vorbereitende Schritte

Die URL des OP-Sitzungsmanagementendpunkts wird vom Attribut check_session_iframe in den Erkennungsdaten abgerufen, die vom Erkennungsendpunkt des OP zurückgegeben werden. Diese URL muss als Ziel eines iframe in der RP-Anwendung verwendet werden, für die die Sitzungsmanagementfunktionalität erforderlich ist. Die RP-Anwendung muss außerdem das Attribut id des iframe kennen, um Window.postMessage()-Anforderungen an den iframe übergeben zu können.

Informationen zu diesem Vorgang

Die RP lädt einen iframe, dessen src-Ziel auf den Sitzungsmanagementendpunkt des OP gesetzt ist, damit der Anmeldestatus eines Benutzers bestimmt werden kann. Der Sitzungsmanagementendpunkt hat Zugriff auf ein Cookie, in dem der Anmeldestatus oder Browserstatus eines Benutzers gespeichert ist. Dieses Cookie mit dem Browserstatus wird aktualisiert, wenn sich ein Benutzer beim OP abmeldet. Die RP kann dann mittels clientseitigem Scripting die Funktion Window.postMessage() des OP-iframe aufrufen, wobei die Client-ID und der derzeit bekannte Sitzungsstatus im Text der Nachricht gesendet werden. Wenn die RP vom OP-Frame eine postMessage mit dem Wert changed zurückbekommt, hat sich der Status der Benutzeranmeldung beim OP geändert. Die RP kann entscheiden, ob der Benutzer abgemeldet werden soll. Wenn der Wert unchanged zurückgegeben wird, ist der Benutzer noch beim OP angemeldet.

Ein Liberty Profile-Server mit aktiviertem OpenID Connect hat unter der folgenden URL Zugriff auf den OpenID-Connect-Sitzungsmanagementendpunkt:

https://server.example.com:443/oidc/endpoint/<Providername>/check_session_iframe
Anmerkung: In diesem Beispiel wird erwartet, dass der SSL-Port des OP 443 ist.

Vorgehensweise

  1. Erstellen Sie in einer geeigneten RP-Anwendung, die einen an den OP-Sitzungsmanagementendpunkt gerichteten iframe laden kann, eine Webressource. Die Webressource muss auch Zugriff auf den Sitzungsstatuswert haben, der im Parameter session_state der Autorisierungsantwort zurückgegeben wird. Der Wert des Sitzungsstatus kann beispielsweise in einem Cookie gespeichert werden oder auf eine andere Art, die es dem clientseitigen Scripting in der Webressource ermöglicht, den Wert zu kennen. Nachfolgend sehen Sie ein Beispiel-HTML-Snippet für einen solchen iframe.
    <iframe id="iframeOP" src="https://server.example.com:443/oidc/endpoint/OidcConfigSample/check_session_iframe" frameborder="0" width="0" height="0"></iframe>
  2. Zum Überprüfen des Anmeldestatus eines Benutzers müssen Sie die Funktion Window.postMessage() des OP-iframe aufrufen und die Client-ID sowie den Sitzungsstatus als Nachrichtenparameter im Format Client-ID + " " + Sitzungsstatus und den Hostnamen des OP als Zielursprungsparameter übergeben. In der folgenden JavaScript-Beispielfunktion erwartet das Script, dass der Sitzungsstatuswert in einem Cookie mit dem Namen session_state gespeichert wird und dass die Funktion getCookieValue() den im Cookie session_state gespeicherten Wert zurückgibt.
    	var targetOP = "https://server.example.com:443";
    	function checkStatus() {
               var client = "client01";
               var sessionState = getCookieValue("session_state");
               var text = client + " " + sessionState;
               var iframe = document.getElementById("iframeOP");
               iframe.contentWindow.postMessage(text, targetOP);
    	}
  3. Konfigurieren Sie die Webressource so, dass sie empfangsbereit für postMessages vom OP ist, die den Wert changed oder unchanged enthalten, um den jeweiligen Anmeldestatus des Benutzers anzugeben. Die RP kann dann entscheiden, ob der Benutzer ausgehend von dem vom OP zurückgegebenen Wert bei der RP abgemeldet werden soll. Die Funktion muss sicherstellen, dass der Ursprung der postMessage mit dem erwarteten OP-Hostnamen übereinstimmt. Nicht übereinstimmende Nachrichten werden zurückgewiesen. Das folgende JavaScript-Beispiel zeigt, wie zu der Webressource ein Ereignislistener für den Empfang solcher Nachrichten hinzugefügt wird.
    	var targetOP = "https://server.example.com:443";
    	window.addEventListener("message", receiveMessage, false);
    	function receiveMessage(event) {
               if (event.origin !== targetOP) {
                         // Ursprung ist nicht der OP. Diese Nachricht muss zurückgewiesen werden.
                         return;
               }
               if (event.data === "unchanged") {
                         // Benutzer ist noch beim OP angemeldet.
               } else {
                         // Benutzer hat sich beim OP abgemeldet.
               }
    	}

Ergebnisse

Ihre RP verfügt jetzt über eine Webressource, die die Sitzungsmanagementfunktionen von OpenID Connect in einem Liberty Profile-Server-OP nutzen kann. Der im OP-iframe verwaltete Browserstatus wird aktualisiert, wenn sich Benutzer beim OP an- oder abmelden. Nach erfolgreicher Anmeldung beim OP wird in der Autorisierungsantwort an die RP ein neuer Sitzungsstatuswert angegeben. Die RP kann dann mit clientseitigem Scripting den Sitzungsstatus des Benutzers auswerten, um ohne zusätzlichen Netzdatenverkehr festzustellen, ob sich der Status der Benutzeranmeldung beim OP geändert hat.

Beispiel

Das folgende HTML-Beispiel zeigt eine vollständige HTML-Seite an, die das OpenID-Connect-Sitzungsmanagement verwendet. Das Attribut src des OP-iframe wird auf die vom OP abgerufene URL des Sitzungsmanagementendpunkts gesetzt. Die Funktion startChecking() wird automatisch alle 60 Sekunden aufgerufen und überprüft den Anmeldestatus des Benutzers. Die Seite verfügt über einen Ereignislistener message, der die Funktion receiveMessage() aufruft, wenn eine postMessage empfangen wird. Diese Funktion stellt sicher, dass die postMessage von der erwarteten Domäne für den OP kommt. Sie überprüft auch den Wert der zurückgegebenen Nachricht, um festzustellen, ob sich der Anmeldestatus des Benutzers geändert hat (changed oder unchanged).

Sie können diese HTML-Seite selbst als unsichtbaren iframe in eine andere Webressource der RP laden. So kann jede Webressource, die diesen iframe lädt, den Anmeldestatus des Benutzers auf der Clientseite überwachen.
	<!DOCTYPE html>
	<html>
	<head>
	<meta charset="ISO-8859-1">
	<title>iFrame-RP-Seite</title>
	</head>
	<body onload="javascript:startChecking()">
            <iframe id="iframeOP" src="https://localhost:8999/oidc/endpoint/OidcConfigSample/check_session_iframe" frameborder="0" width="0" height="0"></iframe>
	</body>
	<script>
            var targetOP = "https://server.example.com:443";
		
            window.addEventListener("message", receiveMessage, false);
		
            function startChecking() {
                      checkStatus();
                      // Status alle 60 Sekunden überprüfen
                      setInterval("checkStatus()", 1000*60);
            }
		
            function getCookieValue(cookieName) {
                      var name = cookieName + "=";
                      var cookies = document.cookie.split(';');
                      if (!cookies) {
                                return null;
                      }
                      for (var i = 0; i < cookies.length; i++) {
                                var cookie = cookies[i].trim();
                                if (cookie.indexOf(name) == 0) {
                                          return cookie.substring(name.length, cookie.length);
                                }
                      }
                      return null;
            }
		
            function checkStatus() {
                      var client = "client01";
                      var sessionState = getCookieValue("session_state");
                      var text = client + " " + sessionState;
                      var iframe = document.getElementById("iframeOP");
                      iframe.contentWindow.postMessage(text, targetOP);
            }
		
            function receiveMessage(event) {
                      if (event.origin !== targetOP) {
                                // Ursprung ist nicht der OP. Diese Nachricht muss zurückgewiesen werden.
                                return;
                      }
                      if (event.data === "unchanged") {
                                // Benutzer ist noch beim OP angemeldet.
                      } else {
                                // Benutzer hat sich beim OP abgemeldet.
                      }
            }
	</script>
	</html>

Symbol das den Typ des Artikels anzeigt. Taskartikel

Nutzungsbedingungen für Information Center | Feedback


Symbol für Zeitmarke Letzte Aktualisierung: 25.08.2015
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=twlp_oidc_session_mgmt_endpoint
Dateiname: twlp_oidc_session_mgmt_endpoint.html