2009-03-04 10 views
3

Ich benötige eine explizite Abmeldeschaltfläche für Benutzer in einer ASP.NET-Webanwendung. Ich verwende IIS6 mit Standardauthentifizierung (SSL). Ich kann auf eine andere Webseite umleiten, aber der Browser hält die Sitzung am Leben. Ich habe gegoogled und einen Weg gefunden, dies zu tun, indem ich eine aktive x-Steuerung ermöglichte, um mit IIS zu kommunizieren und die Sitzung zu beenden. Ich bin in einer eingeschränkten Umgebung, die keine Formularauthentifizierung erlaubt und aktive x-Steuerelemente sind auch nicht verboten. Hat jemand anderes diese Anforderung und wie haben Sie damit umgegangen?Abmelden-Schaltfläche IIS6 ASP.NET-Standardauthentifizierung

Okay das ist, wovor ich Angst hatte. Ich habe ähnliche Antworten im Netz gesehen und ich hatte gehofft, dass jemand eine Möglichkeit haben würde, dies zu tun. Danke für deine Zeit. Ich denke, ich kann Javascript verwenden, um die Zurück-Taste wie die Geschichte zu verhindern.back()

Antwort

4

ich damit, mich für ein paar Tage zu kämpfen hatte.

Mit dem IE spezifischen ‚document.execCommand('ClearAuthenticationCache');‘ ist nicht für jedermann eine gute Wahl: 1) es alle Anmeldeinformationen spült, was bedeutet, dass der Benutzer zum Beispiel auch von seiner gmail oder einer anderen Webseite abgemeldet, wo er zur Zeit authentifiziert hat 2) es ist nur IE;)

Ich habe versucht mit Session.Abandon() und dann auf meine Default.aspx umleiten. Dies allein reicht nicht aus. Sie müssen dem Browser explizit mitteilen, dass die Anfrage nicht autorisiert wurde. Sie können dies tun, indem sie mit so etwas wie:

response.StatusCode = 401; 
response.Status = "401 Unauthorized"; 
response.AddHeader("WWW-Authenticate", "BASIC Realm=my application name"); 
resp.End(); 

Dies führt in der folgenden: Der Benutzer klickt auf den Logout-Button ==> wird er den Grund Login-Fenster. JEDOCH: Wenn er die Escape-Taste drückt (der Anmeldedialog verschwindet) und die Aktualisierung anklickt, sendet der Browser automatisch die Zugangsdaten erneut, was dazu führt, dass sich der Benutzer anmeldet, obwohl er denkt, dass er ausgeloggt ist.

Der Trick, um dies zu lösen, ist immer ein einzigartiges 'Reich' spucken. Dann sendet der Browser die Anmeldeinformationen in dem oben beschriebenen Fall NICHT erneut. Ich entschied mich dafür, das aktuelle Datum und die Uhrzeit auszuspucken.

response.StatusCode = 401; 
response.Status = "401 Unauthorized"; 
string realm = "my application name";     
response.AddHeader("WWW-Authenticate", string.Format(@"BASIC Realm={0} ({1})", realm, DateTimeUtils.ConvertToUIDateTime(DateTime.Now))); 
resp.End(); 

Eine andere Sache, die Sie tun müssen, ist dem Browser mitteilen, die Seite nicht cachen:

Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetExpires(DateTime.MinValue); 
Response.Cache.SetNoStore(); 

Mit all diesen Dingen im Ort, um es (für mich) in IE funktioniert, aber bis jetzt habe ich war noch nicht in der Lage zu verhindern, dass firefox den Benutzer anmeldet, wenn der Benutzer zuerst die Escape-Taste drückt (verbirgt den Basis-Login-Dialog) und dann aktualisiert (F5) oder die Zurück-Taste des Browsers.

0

Haben Sie versucht, Session.Abandon als Reaktion auf die Schaltfläche klicken klicken?

bearbeiten:

Es wäre dies scheint ein klassisches Problem Zurück-Taste.

Es gibt sehr wenig, was Sie über den Zurück-Knopf tun können. Stellen Sie sich vor, der Benutzer hat gerade die aktuelle Seite in einem neuen Fenster geöffnet und dann auf die Schaltfläche logOut geklickt. Diese Seite scheint sich abzumelden, hat aber keinen direkten Einfluss auf den Inhalt des anderen Fensters.

Nur wenn sie versuchen, irgendwo in diesem Fenster zu navigieren, wird es offensichtlich, dass ihre Sitzung weg ist.

Viele Browser implementieren die Zurück-Schaltfläche in ähnlicher (wenn auch nicht identischer) Weise. Zurück zur vorherigen Seite ist nicht unbedingt eine Navigation für einen HTML/HTTP-Blickwinkel.

+0

wenn ich zurückklicke, bin ich noch authentifiziert. geschütztes void logOut_Click (Objektabsender, EventArgs e) { Session.Clear(); Sitzung.Abandon(); ViewState.Clear(); FormsAuthentication.SignOut(); Response.Redirect ("http://www.google.org"); } – willyconnor

2

Die Methode Session.Abandon zerstört alle in einem Session-Objekt gespeicherten Objekte und gibt ihre Ressourcen frei. Wenn Sie die Abandon-Methode nicht explizit aufrufen, zerstört der Server diese Objekte beim Zeitlimit der Sitzung.

+0

Wenn ich zurückklicke, bin ich noch authentifiziert. geschütztes void logOut_Click (Objektabsender, EventArgs e) { Session.Clear(); Sitzung.Abandon(); ViewState.Clear(); FormsAuthentication.SignOut(); Response.Redirect ("http://www.google.org"); } – willyconnor

+0

Das klingt wie Sie eine zwischengespeicherte Version der Seite anzeigen. Wenn Sie versuchen, eine Aktualisierung vom Server zu erzwingen, werden Sie feststellen, dass die Sitzung abgelaufen ist. –

+0

Ich sollte auch beachten, dass Sie das Caching deaktivieren können. Es gibt einige Stackoverflow-Fragen, die erklären, wie dies erreicht wird. –

0

Dies ist eine Lösung für dieses Problem, das in IE6 und höher funktioniert.

<asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="logout();">LinkButton</asp:LinkButton> 


<script> 

    function logout() 
    { 
    document.execCommand("ClearAuthenticationCache",false); 
    } 
</script> 

diese Gefunden von http://msdn.microsoft.com/en-us/library/bb250510%28VS.85%29.aspx

Webteam in Short Ihre Anmeldeinformationen Bitte

Q: Jerry B. schreibt: „Nachdem der Benutzer bestätigt hat und seine Anfrage bearbeitet, möchte ich jetzt Wenn ich annehme, dass sich diese Maschine in einer offenen Umgebung befindet, in der jedermann auf uns zugehen kann, möchte ich jedes Mal, wenn ein Benutzer auf ein bestimmtes Modul im Web zugreift, eine neue Herausforderung stellen. "

A: Dies ist eine häufig angeforderte Funktion des Internet Explorer-Teams und die guten Leute dort haben uns eine Möglichkeit gegeben, dies in Internet Explorer 6.0 SP1 zu tun. Alles was Sie tun müssen, ist die execCommand Methode auf dem Dokument aufrufen, in ClearAuthenticationCache als Befehlsparameter übergeben, wie folgt aus:

document.execCommand("ClearAuthenticationCache"); 

Dieser Befehl leert alle Anmeldeinformationen im Cache, so dass, wenn der Benutzer eine Ressource anfordert, die benötigt Authentifizierung, die Aufforderung zur Authentifizierung erneut auftritt.

Ich habe dies auf meinem Logout-Link-Taste und es funktioniert in IE6 sp1 und höher:

OnClientClick="document.execCommand('ClearAuthenticationCache');" 
Verwandte Themen