2012-10-01 7 views
11

In einer Webseite wir einen Hyperlink zur Verfügung stellen (GET), dass der Benutzer zu authentifizieren, klicken Sie können:ASP.NET MVC - ValidateAntiForgeryToken auslaufenden

@Html.ActionLink("Please Login", "MyMethod", "MyController") 

Diese Karten der folgenden Controller-Methode, die eine Ansicht zurückgibt:

[RequireHttps] 
    public ActionResult MyMethod() 
    { 
     return this.View(new MyModel()); 
    } 

Diese Ansicht enthält das Formular, in dem der Benutzer seine Anmeldeinformationen eingibt; Das Formular enthält die erforderlichen AntiForgeryToken.

Wenn der Benutzer das Formular abschickt, wird die folgende Controller-Methode aufgerufen:

[HttpPost] 
    [RequireHttps] 
    [ValidateAntiForgeryToken] 
    public ActionResult MyMethod(MyModel model) 
    { 
     // my logic 
    } 

Dies funktioniert sehr gut, die meiste Zeit ...

Wenn jedoch der Benutzer verlässt ihren Browser öffnen für einen „signifikanten“ Zeitraum und führt dann die folgenden Schritte in rascher Folge:

  1. Klicks auf den Hyperlink (GET) die Log-in-Form zu laden
  2. füllt das Formular aus und sendet

Sie erhalten eine Ausnahme, sie zu informieren, dass der Anti-Fälschungs Token war entweder nicht vorgesehen oder war ungültig.

Ich verstehe nicht, warum dies der Fall ist: Die Ansicht (mit dem Formular) wird erstellt, nachdem der Browser ruhte und so die Anti-Fälschungs-Token alle "frisch" sein sollten. Bei diesem Design ist jedoch offensichtlich etwas nicht in Ordnung, aber ich bin mir nicht sicher, wie ich es am besten beheben kann.

Vielen Dank im Voraus, wenn Sie irgendwelche Vorschläge haben.

Griff

+0

Ich möchte nur erwähnen, dass meine App dieses Problem seit ein paar Jahren erlebt hat, und ich würde gerne eine Lösung haben. Ich habe alle Standard-Key-Fixes ausprobiert. – Jonathan

+0

Rollen Sie die Ärmel hoch und tauchen Sie in die Quelle ein. Ich werde die Pumpe bemannen. – Nick

+0

Es gibt einen [Artikel] (http://stackoverflow.com/questions/5767768/troublingshooting-anti-forgery-token-problems?rq=1), der die Validierungsschritte für das Token detailliert. Ein Schritt besteht darin, sich gegenüber dem Benutzer des Context zu vergewissern - nicht sicher, ob das nicht der Fall ist. In beiden Fällen bleibt die Lösung unklar. – DrGriff

Antwort

9

ich mit diesem gleichen Problem zu tun habe und während ich das Problem verstehen, ich bin noch nicht sicher, die besten Auflösung.

Der Prozess Anti-ForgeryToken platziert einen Eingabewert in das Formular mit einem zweiten Wert, der in einem Cookie RequestVerificationToken gespeichert ist. Beide werden an den Server gesendet und wenn sie nicht übereinstimmen, wird der Fehler ausgelöst.

Der Cookie "RequestVerficationToken" hat einen Ablaufwert, der als Sitzung festgelegt wird. Wenn der Benutzer den Browser für eine lange Zeit auf der Seite offen lässt und ihn dann einreicht, wird der Zeitstempel des Cookies mit dem Sitzungszeitlimitwert auf dem Server verglichen - ein Standardwert von etwa 20 Minuten - und bei Überschreitung wird er entfernt und daher schlägt die Token-Validierung fehl.

Mögliche Lösungen, die alle mögliche Probleme haben;

  1. Setzen Sie einen JavaScript-Timer auf die Seite und aktualisieren Sie bei einem Wert weniger als Ihre Sitzung Timeout.
  2. Fangen Sie die System.Web.Mvc.HttpAntiForgeryException auf dem Server - und Umleitung auf die gleiche Seite.
  3. Ihre Session-Timeout
  4. Ändern Sie den Ablauf auf der Fälschungs Token erhöhen
+1

Beachten Sie, dass der Computerschlüssel zum Überprüfen des Anti-ForgeryTokens auf dem Server und für die Verwendung in einer Webfarm verwendet wird (und das Festlegen eines statischen Systemschlüssels möglicherweise eine durch einen Neustart des Arbeitsprozesses verursachte Fehlerbedingung löst) auf dem Server), jedoch wird das Cookie-Ablaufproblem nicht gelöst. –

+0

Wie Sie sagten, ist der Cookie-Ablauf an die Sitzung gebunden, so dass Lösung 3 auch zu Lösung 4 führen sollte. Es sei denn, Sie überschreiben manuell, wie der Cookie irgendwie generiert wird. Ich habe Lösung 1 in der Vergangenheit versucht und es ist nicht immer absolut zuverlässig, so scheint eine Kombination von 3 (wenn möglich) und 2 wie die besten Optionen. – Rowan