MVC5 AntiForgeryToken - how to handle "Den mitgelieferten anti-forgery token gemeint war, für den Benutzer "", aber der aktuelle Benutzer ist "xxx"." Ausnahme?
Möchte ich zum Schutz unserer login Aktionen von AntiforgeryToken - Attribut - ich weiß, warum die Ausnahme von der Thema kommt, aber ich kann nicht scheinen zu finden, eine gute Lösung für Sie.
Lassen Sie uns sagen, wir haben den folgenden Situationen:
-
Es ist 8:00 UHR die Benutzer der Anwendung sind, zur Arbeit zu kommen, Sie sitzen, und starten Sie den login-Prozess - jetzt ist es sehr möglich, dass einige Benutzer erhalten die gleichen ValidationToken. Nach der ersten anmeldet - alle anderen sehen die oben genannten Ausnahme (oder einige andere benutzerdefinierte Ausnahme Bildschirm), wenn Sie versuchen, sich anzumelden.
-
Einige user angemeldet haben, dann versehentlich gedrückt die "zurück" - Taste, und versuchte, wieder anmelden - das ist zwar eher unwahrscheinlich, kann es passieren, und ich don ' T möchten, dass Benutzer finden Sie unter Ausnahmen, wenn es funktioniert.
Also die Frage ist einfach - , wie um zu verhindern, dass die genannten Situationen, oder wie mit Ihnen umzugehen ist, so dass die Benutzer nicht merken, dass etwas. Ich habe versucht, die folgenden:
- Einstellung der AntiForgeryConfig.SuppressIdentityHeuristicChecks = true; in Application_Start in der Global.asax - es nicht das problem zu beheben, ich bekomme immer noch die gleiche exception
- Einstellung der [OutputCache(NoStore = true, Dauer = 0, VaryByParam = "None")] auf die Methode mit [ValidateAntiForgeryToken] - Attribut - wieder, kein Glück gibt es
Jetzt dachte ich manuell validiert das token in Aktion Körper, fangen Sie den Fehler, und überprüfen Sie, ob versucht wurde, durch " anonymer Benutzer:
public ActionResult SomeAction()
{
try
{
AntiForgery.Validate();
}
catch(HttpAntiForgeryException ex)
{
if(String.IsNullOrEmpty(HttpContext.User.Identity.Name))
{
throw;
}
}
//Rest of action body here
//..
//..
}
Oben scheint zu verhindern, dass der Fehler - aber ist es sicher? Welche alternativen gibt es?
Vielen Dank im Voraus.
Beste Grüße.
EDIT:
Die endgültige "Lösung" war zu deaktivieren token-Validierung auf der login-Formular - kann es einen besseren Weg, es zu handhaben, aber es scheint, dass alle Lösungen, die ich fand, waren hässliche workarounds wie bei mir oben vorgeschlagen.
Da es keine Möglichkeit gibt zu wissen, wie "sicher" diese alternativen sind (wenn Sie sicher sind, an alle), haben wir beschlossen, zu tun, deaktivieren Sie die token-Validierung auf login.
- Sie können Skripts verwenden, zu deaktivieren, doppelte Einsendungen, stackoverflow.com/questions/2830542/...
- Hi, ich habe das gleiche Problem, wenn Nutzer die Schaltfläche "zurück" im browser. Was hast du mit?
- Finden Sie in der Sektion BEARBEITEN meine Frage, da nur das login-Formular hat uns dieses problem, in dem Ende, wir haben nur deaktiviert die token-Validierung. Wir beschlossen, dass es einfach nicht der Mühe Wert, und ehrlich gesagt, konnte ich nicht finden keine 'saubere' Lösung - nur hässliche workarounds (wie die, die ich gepostet mit der try-catch).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen-Einstellung (in global.cs):
Dies wird fügen Sie der name-Bezeichner, um Ihre token,
Als für die Doppel-login-Problem versuchen ein Skript zu nutzen-Dokument das Datum und die Uhrzeit des Originals Einreichen zu stoppen, eine zweite Einreichen mit dem gleichen token.
Damit wir wissen, eine Sache, die Benutzer, wie die zurück-Taste und haben eine Gewohnheit der Doppel-klicken Sie, dies ist ein großes Problem mit dem AntiforgeryToken.
Aber je nachdem, was Ihre Anwendung tut, es gibt Möglichkeiten für die Begrenzung der Zwang, dies zu tun. Das einfachste ist, Ihr bestes zu tun, um zu versuchen und machen Sie dem Besucher nicht das Gefühl, dass Sie brauchen, um "Rücklauf" Ihre Anfrage zu verändern.
"Was ist Los?" - Halten die Nutzer informiert
Wenn ein AntiForgeryToken nicht überprüfen Sie Ihre website, wird eine Ausnahme des Typs System.Web.Mvc.HttpAntiForgeryException.
Wenn Sie eingerichtet haben, ist richtig, du hast freundlich Fehlern eingeschaltet und dies wird bedeuten, dass Ihre Fehler-Seite wird nicht angezeigt, eine Ausnahme und zeigen eine schöne Fehlerseite, die sagt was Sache ist.
Können Sie diese ein wenig leichter wenigstens, sodass der Benutzer eine informative Seite, die sich gezielt an diese Ausnahmen, durch den Fang des HttpAntiForgeryException.
und Ihre
/error/antiforgery
view kann Ihnen sagen, Leid, dass Sie versucht haben, die zum senden der gleichen Informationen zweimalWeitere Idee ist es, den Fehler protokollieren und den Benutzer zur login-Bildschirm:
Erstellen Sie eine
HandleAntiforgeryTokenErrorAttribute
Klasse, Überschreibt das OnException-Methode.HandleAntiforgeryTokenErrorAttribute.cs:
Globale Filter:
Ich würde auch ein paar tools zum aufzeichnen alle Ihre Informationen wie login ist Kritischer Bestandteil Ihrer Anwendung
NLog für die Allgemeine Protokollierung und E-Mails auf kritische Ausnahmen der Anwendung (einschließlich web Ausnahmen).
Elmah für das filtern von web-und E-Mail-Ausnahmen.
EDIT:
Auch möchten Sie vielleicht, um ein jQuery-plugin namens SafeForm. Link
EDIT:
Habe ich gesehen, Zut Diskussion dieser und jeden Blick auf das Thema haben gültige Punkte, Wie ich es sehe (aus owasp.org)
Nun bin ich auch mit autorisierten IP-Adressen für die Anmeldung zum zuteilen von meinen Anwendungen mit 2-Faktor-Autorisierung wenn der Benutzer IP-Adresse ändert, so dass wenn Sie Cross-Site Request Forgery im Spiel war, die Nutzer würden nicht mit der IP-Adresse und Anfrage 2-Faktor-Autorisierung. fast wie ein security-router funktionieren würde. aber wenn du es behalten möchtest, auf deine login-Seite sehe ich nicht ein problem so lange, wie Sie Ihre freundliche Fehler-Seiten einrichten, die Menschen werden sich nicht aufregen, da Sie sehen, dass Sie etwas falsch gemacht haben.
HttpContext.Current.Response.Clear(); HttpContext.Current.Server.ClearError(); HttpContext.Current.Response.Redirect("/error/antiforgery", true);
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;
funktionierte nicht für mein MVC 5 Projekt 🙁 Noch immer die gleiche "Das mitgelieferte anti-forgery token gemeint war, für den Benutzer "", aber der aktuelle Benutzer ist "xxx"." Ausnahme"