MVC5 AntiForgeryToken - wie man damit umgeht "Das mitgelieferte Anti-Fälschungs-Token war für Benutzer" "gedacht, aber der aktuelle Benutzer ist" xxx "." Ausnahme?

8

Ich möchte unsere Login Aktionen zum Schutz von AntiforgeryToken Attribut -. Ich weiß, warum die Ausnahme von dem Thema auftritt, aber ich kann nicht für sie jede gute Lösung zu finden scheinen

Sagen wir, wir haben die folgenden Situationen:

  1. Es ist 8.00 Uhr, die Benutzer der Anwendung kommen zur Arbeit, sie setzen sich hin und starten den Anmeldevorgang - im Moment ist es sehr gut möglich , dass einige Benutzer das gleiche erhalten ValidationToken Nachdem sich der erste Benutzer angemeldet hat, sehen alle anderen Benutzer die obige Ausnahme (oder einen anderen benutzerdefinierten Ausnahmebildschirm), wenn sie sich anmelden.

  2. Einige Benutzer angemeldet, dann drückte versehentlich die „ zurück “ und versucht, sich erneut anzumelden - während dies unwahrscheinlich ist, kann es passieren, und ich will nicht Benutzer um Ausnahmen anzuzeigen, wenn dies der Fall ist.

Die Frage ist also einfach - wie Sie die oben genannten Situationen verhindern oder mit ihnen umgehen können, damit die Benutzer nichts bemerken . Ich habe folgendes versucht:

  1. Einstellung AntiForgeryConfig.SuppressIdentityHeuristicChecks = true; in Application_Start in Global.asax - es hat das Problem nicht beheben , habe ich noch bekommen die gleiche Ausnahme
  2. Einstellung [Output (NoStore = true, Dauer = 0, VaryByParam="None")] auf die Methode mit [ValidateAntiForgeryToken] Attribut - wieder , kein Glück dort

Ich habe gerade daran gedacht, das Token in Action Body manuell zu validieren, den Fehler zu erkennen und zu prüfen, ob der Versuch von einem anonymen Benutzer unternommen wurde:

%Vor%

Das obige scheint die Fehler zu verhindern - aber ist es sicher? Welche Alternativen gibt es?

Vielen Dank im Voraus.

Beste Grüße.

BEARBEITEN:

Die endgültige „Lösung“ war Token-Validierung auf Login-Formular zu deaktivieren - kann es ein besserer Weg, es zu handhaben, aber es scheint, dass alle Lösungen, die ich gefunden, hässliche Workarounds wie bei mir waren oben vorgeschlagen.

Da es keine Möglichkeit gibt zu wissen, wie "sicher" diese Alternativen sind (wenn sie überhaupt sicher sind), haben wir beschlossen, die Token-Validierung bei der Anmeldung zu deaktivieren.

    
user2384366 18.09.2015, 13:19
quelle

1 Antwort

8

Versuchen Sie die Einstellung (in global.cs):

%Vor%

Dies fügt Ihrem Token die Namenskennung hinzu,

Wie bei der doppelten Anmeldung versuchen Sie, ein Skript zu verwenden, um das Datum und die Uhrzeit des ursprünglichen Sendens zu dokumentieren, um ein zweites Senden mit demselben Token zu stoppen.

%Vor%

So wissen wir eine Sache; Benutzer mögen die Zurück-Taste und haben eine Angewohnheit des Doppelklicks, das ist ein großes Problem mit AntiforgeryToken.

Aber abhängig davon, was Ihre Anwendung tut, gibt es Möglichkeiten, ihren Zwang dazu zu begrenzen. Am einfachsten ist es, wenn Sie versuchen, dem Besucher das Gefühl zu geben, er müsse seine Anfrage "zurückspulen", um ihn zu ändern.

  

Stellen Sie sicher, dass Formularfehlermeldungen klar und präzise sind, um sicherzustellen, dass   Benutzer weiß, was falsch ist. Contextual Fehler geben Bonuspunkte.

     

Halten Sie den Formularstatus zwischen Formulareinreichungen immer ein. Außer, abgesondert, ausgenommen   Passwörter oder Kreditkartennummern gibt es keine Entschuldigung dank MVC   Helfer bilden. @Html.LabelFor(x => x.FirstName)

     

Wenn Formulare über Tabs oder versteckte divs verteilt sind, wie sie in   SPA Frameworks wie Angular oder ember.js, seien Sie smart und zeigen Sie die   Controller-Layouts oder Formular, von dem die Fehler tatsächlich stammen   die Formularübergabe bei der Anzeige des Fehlers. Leite nicht nur Regie   zum Home-Controller oder zum ersten Tab.

"Was ist los?" - Den Benutzer auf dem Laufenden halten

Wenn ein AntiForgeryToken nicht validiert wird, löst Ihre Webseite eine Ausnahme vom Typ System.Web.Mvc.HttpAntiForgeryException aus.

Wenn du richtig eingerichtet hast, hast du freundliche Fehler aktiviert und das bedeutet, dass deine Fehlerseite keine Ausnahme zeigt und eine nette Fehlerseite anzeigt, die ihnen sagt, was los ist.

Sie können dies ein wenig einfacher machen, indem Sie dem Benutzer zumindest eine informativere Seite geben, die auf diese Ausnahmen abzielt, indem Sie die HttpAntiForgeryException abfangen.

%Vor%

und Ihre /error/antiforgery -Ansicht können ihnen sagen Es tut uns leid, dass Sie versucht haben, dieselben Informationen zweimal zu übermitteln

Eine weitere Idee besteht darin, den Fehler zu protokollieren und den Benutzer auf den Anmeldebildschirm zurückzusetzen:

Erstellen Sie eine HandleAntiforgeryTokenErrorAttribute -Klasse, die die OnException-Methode überschreibt.

HandleAntiforgeryTokenErrorAttribute.cs:

%Vor%

Globaler Filter:

%Vor%

Ich würde auch ein paar Tools verwenden, um alle Ihre Informationen aufzuzeichnen, da der Login ein kritischer Teil Ihrer Anwendung ist.

NLog für die allgemeine Protokollierung und E-Mails zu kritischen Anwendungsausnahmen (einschließlich Webausnahmen).

>

Elmah zum Filtern und E-Mail von Web-Ausnahmen.

BEARBEITEN: Vielleicht möchten Sie auch ein jQuery-Plugin namens SafeForm betrachten. Link

BEARBEITEN:

Ich habe eine Menge Diskussionen darüber gesehen und die Meinungen aller zu diesem Thema haben gültige Punkte. Wie ich es sehe, ist (aus owasp.org )

  

Cross-Site Request Forgery (CSRF) ist ein Angriff, der einen Endbenutzer zwingt   um unerwünschte Aktionen in einer Webanwendung auszuführen, in der sie sich befinden    Derzeit authentifiziert CSRF-Angriffe zielen insbesondere auf Statusänderungen ab, nicht auf Datendiebstahl. Das Anti-Fälschungs-Token ist   spezifisch für "wer ist angemeldet". Also, sobald Sie sich einloggen, gehen Sie zurück, die   altes Token ist nicht mehr gültig

Jetzt verwende ich auch autorisierte IP-Adressen für die Anmeldung zur Zuteilung meiner Anwendungen mit 2-Faktor-Autorisierung, wenn sich die Benutzer-IP-Adresse ändert. Wenn also Cross-Site Request Forgery im Spiel war, würde der Benutzer die IP-Adresse und Anfrage nicht zuordnen Faktor Autorisierung. fast so, wie ein Sicherheits-Router funktionieren würde. aber wenn du es auf deiner Anmeldungsseite behalten willst, sehe ich kein Problem, solange du deine freundlichen Fehlerseiten eingerichtet hast, werden die Leute nicht verärgert, da sie sehen werden, dass sie etwas falsch gemacht haben.

    
pool pro 18.09.2015, 16:34
quelle