automatisches Einloggen über Scripte vs. single-sign-on mit cookies

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

About gordenschollbach

Nun wird es Zeit ein wenig über mich preiszugeben. Ich bin 32 Jahre alt/jung (wie man es sehen will), habe drei Kinder und bin verheiratet. Ich bin bei der Bundeswehr in der Informationstechnikschiene eingestiegen und auch dabei geblieben. Meine Weiterentwicklung geht in die Richtung, dass ich mich jetzt weniger mit der Hardware befasse sondern mehr mit der Software. Seit meiner Versetzung auf meinen aktuellen Dienstposten beschäftige ich mich hauptsächlich mit dem Informationsmanagement und spezialisiere mich auf die technische Umsetzung von "visionären" Ideen. Wir betreiben das Informationsportal des Flottenkommandos und versuchen es so benutzerfreundlich wie möglich aufzubohren. Ich scripte mit JavaScript und PHP. Die Programmiersprachen, die ich nicht nur gehört sondern auch schon mal benutzt habe, sind: Asembler, Basic, TurboPascal, HTML, Java2 und C++. Wobei Java2 und HTML die noch am frischesten sind und die ich deshalb bevorzuge. Da ich schon als Datenbankentwickler und -administrator eingestzt war, behaupte ich mich auch mit MS-Access und PostgreSQL auszukennen. Derzeit will ich mich ein wenig weiterbilden und lerne deshalb noch Python. Ajax ist dann das nachfolgende Projekt. Meine Hobbies begrenzen sich momentan ausschließlich auf meine Familie. Ich wünsche allen Besuchern von Mickey's Blog viel Spass und möget ihr die Informationen finden, nach denen ihr suchet.
This entry was posted in Allgemein, deutsch. Bookmark the permalink.

Leave a Reply