2010-01-25 4 views
5

Ich habe eine MVC-Anwendung, die [Authorize] verwendet, um die privaten Bits zu schützen. Wenn ich die SignOut() URL auswähle, signiert es mich ab, aber wenn ich die Zurück-Taste in meinem Browser drücke, geht es auf die sichere Seite und erlaubt mir sogar, das Formular zu benutzen. Die Aktion findet statt und zeigt dann, dass ich abgemeldet bin. Das Problem ist, dass es die gesicherte Aktion ausführt (Einfügen einer Zeile in meine Datenbank). Dann kann ich den Zurück-Knopf wieder benutzen und alles machen. Wenn ich nach dem Abmelden die Zurück-Taste benutze und die Browseraktualisierung drücke, wird angezeigt, dass ich ausgeloggt bin und mir den Zugriff auf die sichere Seite verweigere.Verwendung der Zurück-Schaltfläche des Browsers, nachdem SignOut() Zugriff auf sichere Seite ermöglicht (ASP.NET MVC)

Fehle ich etwas Wichtiges? Es scheint, als könnte es ein wirklich großes Sicherheitsproblem sein.

public ActionResult LogOff(string ReturnUrl) 
{ 

    FormsAuth.SignOut(); 

    if (!String.IsNullOrEmpty(ReturnUrl)) 
    { 
     return Redirect(ReturnUrl); 
    } 
    else 
    { 

    return RedirectToAction("Index", "Page"); 
    } 
} 
+4

zu helfen Hast du vergessen, [Autorisieren] um die Aktion, die akzeptiert den Post (über [AcceptVerbs (HttpVerbs.Post)]? – Langdon

+0

Nein, aber wenn ich zurück ging einen Blick haben ich es so hatte: \t \t [AcceptVerbs (HttpVerbs.Get)] \t \t [autorisieren (Roles = "Administrator")] und \t \t [AcceptVerbs (HttpVerbs .Post)] \t \t Wenn ich das Authorize-Flag vor den AcceptVerbs sowohl für Get und Post setzen, lassen Sie mich immer noch zurück zum Formular, aber es würde mich nicht zulassen, es zu veröffentlichen . – mark123

+0

Ich möchte es immer noch nicht zeigen, die sichere Form, ob es ermöglicht, zurück oder nicht zu buchen. Das ist ein seltsames Problem. Mit der [Autorisieren] Dekoration sollte ich nicht für IsAuthenticated testen müssen, sollte ich? \t \t \t if (! User.Identity.IsAuthenticated) {return RedirectToAction ("Anmelden", "Konto");} – mark123

Antwort

5

Ich denke, das Problem ist, dass der Browser die Seite zwischenspeichert. Deshalb wird die Seite nicht neu geladen, nachdem Sie auf Zurück geklickt haben. Wenn Sie in den Headern angeben, dass die Seite nicht zwischengespeichert werden soll, sollte die Seite nach dem Drücken der Zurück-Schaltfläche erneut geladen werden. Und dann wird der Benutzer abgelehnt.

Allerdings könnte es in einigen Fällen schwierig sein, es zum Laufen zu bringen. Weitere Informationen finden Sie unter Caching Tutorial.

1

Verwenden Sie Sitzungsinformationen? FormsAuth.SignOut() wirkt sich nur auf neue Instanzen einer Seite aus. Als du zurück gingst, warst du berechtigt, (vorher) dort zu sein. Das PostBack ist erlaubt, es sei denn, Sie haben einen Code, der nach dem Cookie/der Session/Authentizität der Anfrage sucht. Es umgeht sogar die global.asax, weil der ViewState bereits generiert wird.

Sie möchten eine Sitzung Tötung Anweisung oder bieten einige zusätzliche Authentifizierungskontrollen in Ihren Basisklassen hinzufügen, um sicherzustellen, dass ein Benutzer wirklich berechtigt ist, zu sein, wo sie sind, wenn sie.

Alternativ können Sie das Seiten-Caching deaktivieren, was die Schaltfläche "Zurück" ziemlich nutzlos machen sollte (die Standardeinstellung für die Seite wird abgelaufen sein). Dies wird für Benutzer, die sich auf die Zurück-Schaltfläche verlassen, merkwürdig sein, aber es wird dazu beitragen, die Sicherheit der Seite zu gewährleisten, da es ein "erneutes Rendern" der Seite an erster Stelle erzwingt.

+0

Er verwendet MVC, so Postbacks und Viewstates sollte kein Problem sein. Die Verwendung von 'Session.Abandon()' auf dem Logout-Steuerelement ist jedoch eine gute Idee. –

+0

Ich verwende in diesem Fall keine Session-Informationen. – mark123

3

Das Löschen der Sitzung könnte helfen. Hier ist meine Abmelde-Methode:

public ActionResult Signout() 
    { 
     Session.Clear(); 
     FormsAuthentication.SignOut(); 
     return RedirectToAction("Index", "Home"); 
    } 
1

dies zu spät Antwort ist, aber ich hoffe, in Global.asax hinzufügen, um dieses Verfahren

protected void Application_BeginRequest() 
{ 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1)); 
    Response.Cache.SetNoStore(); 
} 

und dann, nachdem die Haupt Aktion hinzufügen, um dieses Kontroll

if (Request.IsAuthenticated) 
{ 
    // do something 
} 
else 
{ 
    return RedirectToAction("LoginPage", "ControllerName"); 
} 

jemanden in einer Zeit, zu helfen (Hauptaktion bedeutet jede [httpget] Aktion) und es wird sehr funktionieren Ich hoffe,

Verwandte Themen