2009-03-17 3 views
2

Ich arbeite an einer ASP.NET-Anwendung, bei der sich unsere Benutzer mithilfe von Clientzertifikaten über HTTPS authentifizieren. Unsere Benutzer benutzen nur IE7.Wie lösche ich den SSL-Status im Browser, wenn die Benutzersitzung abläuft?

Sobald ein Clientzertifikat erfolgreich authentifiziert wurde, verbleibt es im SSL-Cache des Browsers, bis der Prozess geschlossen wird oder der Benutzer den SSL-Cache manuell löscht. Wir möchten den SSL-Cache löschen können, wenn sich ein Benutzer abmeldet oder die Sitzung abläuft, um die Sicherheit des Systems zu verbessern.

Unsere Kunden verwenden bereits Smartcards für den Zugriff auf das System, die Zertifikate automatisch entladen, wenn die Karte vom Clientcomputer entfernt wird. Dadurch wird jedoch der Browsercache überhaupt nicht gelöscht, was eine potenzielle Angriffsmöglichkeit eines anderen Benutzers zur Folge hat Zugriff auf die gleiche Maschine wie der echte Benutzer.

Ich habe herausgefunden, wie die tatsächliche Cache-Bereinigung von JavaScript zu tun:

document.execCommand ("ClearAuthenticationCache");

funktioniert einwandfrei, wenn ein Benutzer explizit abmeldet, da wir das Skript auf dem Client ausführen können, bevor der Benutzer sich erneut anmelden kann.

HINWEIS: IE7 lässt nur den Cache programmgesteuert löschen, wenn HTTP Keep-Alives auf dem Webserver deaktiviert sind.

Hier ist das knifflige Bit - wenn eine Sitzung eines Clients abläuft, weiß ich keine Möglichkeit, dies im Browser zu behandeln, bevor der Benutzer versucht, sich erneut anzumelden. Ich kann den Status nicht löschen, wenn sie auf die Anmeldeseite gelangen, da ich den Status gelöscht und ein neues Zertifikat auswählen muss, bevor die Seite auf dem Server ausgeführt wird.

Irgendwelche Ideen? Entschuldigung für die Länge der Frage, aber Hintergrund ist wichtig für diesen.

Antwort

2

Es macht nichts, ich kam mit einer guten Lösung:

  • Wenn der Benutzer erfolgreich anmeldet, sie eine zusätzliche Session-Cookie erstellen, die nicht abläuft, bis der Browser geschlossen wird.

  • Wenn der Benutzer später zur Anmeldeseite zurückkehrt und die Anfrage nicht authentifiziert ist, prüfen wir das Vorhandensein des Sitzungscookies - falls vorhanden, wissen wir, dass der Benutzer zuvor eine Sitzung hatte, also protokollieren wir diese explizit sie aus, genau wie wir es für die benutzerinitiierte Abmeldung tun. Wenn der Sitzungscookie nicht existiert, versuchen wir, den Benutzer automatisch mit seinem Zertifikat einzuloggen.

  • Der benutzerdefinierte Sitzungscookie wird für jede explizite Abmeldung gelöscht und für jede erfolgreiche Anmeldung erneut ausgefüllt.

Dies gibt uns die beste Erfahrung für den Benutzer, und gewährleistet, dass ein Zertifikat nur so lange zwischengespeichert wird als eine Sitzung noch gültig ist (15 Minuten, Gleiten). Außerdem kann der Sitzungscookie nicht vom Benutzer entfernt werden, sodass dieses Verhalten nicht umgangen werden kann. Sie können die Site nicht verwenden, ohne Session-Cookies zu akzeptieren.

+0

Wie können Sie sie explizit "abmelden"? Wenn dies ein JS-Aufruf von "ClearAuthenticationCache" auf der Clientseite ist, kann ein PowerUser diesen Aufruf umgehen (hacken des clientseitigen Codes). –

+0

Bump auf Laurents Frage –

+0

Wir protokollieren sie auf dem Server, nur die normale FormsAuthentication.SignOut() -Methode - keine Client-Interaktion. – Sam