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
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-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
Vorgehensweise
Ergebnisse
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).
<!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>