Wir möchten gern eine Möglichkeit schaffen, bei der der Nutzer sich nicht auf jeder Site des WISE neu identifizieren muss. Dazu haben wir uns überlegt, mit Hilfe eines eindeutigen Nutzernamens die Berechtigung des Nutzers aus einer Datenbank zu filtern. Dazu bietet sich bei Windowssystemen geradezu der WinLogon-Name an. Diesen will Windows aber von sich aus partout nicht preisgeben. Nach mehreren Fehlversuchen habe ich erfolgreich ein Apachemodul zur Identifizierung des WinLogon-Namen des Clientusers beim WISE-Apache eingebunden. Das Modul heisst mod_SSPI und ist nur in Intranets einsetzbar. Im Grunde verwendet das SSPI die NTLM-Authentifizierung von Windows für ein in der httpd.conf des Apache angegebenes Verzeichnis. Wird dieses nun angesurvt, so muss der Client sich am Apachen im 3-Wege-Handshake (u.a. auch mit dem eingeloggten Windowsnutzer) identifizieren.
Mit Hilfe dieses Moduls wollte ich nun den Anmeldenamen einfach in einem Cookie speichern und so bei Bedarf verfügbar machen. Bei meinen ersten Lösungsansätzen zum Ausprogrammieren eines Single-Sign-On für WISE mittels Cookies, bin ich sehr schnell an den Sicherheitsdirektiven von Cookies gescheitert. Es verhält sich so, dass Cookies nur durch Vererbung Gültigkeit haben. D.h. um ein Cookie auf allen Sites eines WISE-Portals ferfügbar zu machen, muss es in der obersten Strukturebene erzeugt werden (www.test.abc). Sobald es auf einer Site (www.test.abc/beispiel) erzeugt wird, ist es auch nur auf dieser Site und allen darunter liegenden Objekten verfügbar. Da ich keine Lösung fand und auch nicht die Motivation hatte noch länger nach einer Lösung zu suchen, habe ich mir ein anderes Konzept zur ständigen Verfügbarkeit des WinLogon überlegt.
Im Header wird mittels JavaScript und zur Verfügung stehenden dtml-Variablen ausgelesen, ob der Nutzer aus einem bestimmten IP-Adresskreis kommt und bei zutreffender Bedingung ein automatisches Logon als angegebener WISE-Nutzer(Rolle) durchgeführt. Somit habe ich ein scheinbares Single-Sign-On für diese Rolle erzeugt. Weiter wird im Header geprüft, ob der angemeldete WISE-Nutzer gleich einem bestimmten WISE-Nutzer ist. Ist dies der Fall, so wird ein Button angezeigt zum Anmelden auf der Site mit der maximal zur Verfügung stehenden Rolle. Wenn dies nicht der Fall ist wird kein Button angezeigt. Bei Betätigung des Button wird ein PHP-Script geöffnet und die Herkunfts-URL mit übergeben. In dem Script wird geprüft, ob es eine Datei gibt, in der der WinLogon des Clientusers steht. Ist dies nicht der Fall, so wird ein weiteres PHP-Script aufgerufen, welches in dem Verzeichnis steht, das der Apache mit SSPI authentifiziert. Dieses Script erstellt die geforderte Datei und speichert diese mit der Session-ID als Namen. Danach wird wieder das vorherige PHP-Script aufgerufen. Nun ist die Datei vorhanden und kann ausgelesen werden und der WinLogon in einer Variable abgelegt werden. Diese Prüfung gleich zum Anfang des Scriptes habe ich eingebaut, um die Authentifizierung des Clientnutzers über das 3-Wege-Handshake so wenig wie möglich zu nutzen. Mit dem WinLogon und der Herkunfts-URL wird jetzt ein Select auf eine Datenbank ausgeführt. In dieser Datenbank sind alle Sites des WISE, die Rollen und alle Nutzer enthalten, die höhere Berechtigungen haben sollen. Der Select liefert einen Zahlenwert für die Rolle zurück. Dieser Wert und die Herkunfts-URL werden an ein weiters PHP-Script übergeben.
In diesem Script wird zum einen der Login protokolliert um später eindeutig nachvollziehen zu können, wer wann angemeldet wurde und zum anderen wird ein Aufruf des letzten erforderlichen PHP-Scripts durch ein Switch auf den Zahlenwert der Rolle erzeugt, um den Nutzer mit der richtigen Rolle anzumelden. Das so gestartete letzte PHP-Script bindet die richtigen Anmeldedaten zur Laufzeit ein und logt den Nutzer so im WISE ein.
Letztendlich kann ich keine Garantie für Funktionalität an anderen Standorten geben, da die NTLM-Athentifizierung nicht überall vom Browser durchgeführt wird und auch nur innerhalb einer Domäne funktioniert. Diese mehrfach angesteuerten verschieden Scripte sind notwendig um zum einen die Sicherheit zu maximieren sowie die Verfolgbarkeit der Verlinkungen zu minimieren und zum anderen, damit die Nutzerdaten mit übertragen werden. So würde z.B. ein “include() ” des 2. PHP-Scriptes nicht funtionieren, da ein “include()” nicht mit den Berechtigungen des Nutzers durchgeführt wird, sondern als “SYSTEM”.
Eine Funktionsdarstellung in Bildform folgt.
Gorden