Ich erstelle eine einseitige Anwendung und habe ein Problem mit Anti-Fälschungs-Token.
Ich weiß, warum das Problem auftritt. Ich weiß nur nicht, wie ich es beheben soll.
Ich erhalte die Fehlermeldung, wenn Folgendes passiert:
- Nicht angemeldeter Benutzer lädt einen Dialog (mit einem generierten Fälschungsschutz-Token).
- Benutzer schließt den Dialog
- Benutzer meldet sich an
- Der Benutzer öffnet den gleichen Dialog
- Der Benutzer sendet das Formular im Dialog
Anti-Fälschungs-Token ist für Benutzer "" gedacht, aber der aktuelle Benutzer ist "Benutzername".
Der Grund dafür ist, dass meine Anwendung zu 100% einseitig ist. Wenn sich ein Benutzer erfolgreich über einen Ajax-Beitrag bei anmeldet, schalte /Account/JsonLogin
ich einfach die aktuellen Ansichten mit den vom Server zurückgegebenen "authentifizierten Ansichten" aus, lade sie jedoch nicht neu Seite.
Ich weiß, dass dies der Grund ist, denn wenn ich die Seite zwischen den Schritten 3 und 4 einfach neu lade, liegt kein Fehler vor.
Es scheint also, dass @Html.AntiForgeryToken()
im geladenen Formular immer noch ein Token für den alten Benutzer zurückgegeben wird, bis die Seite neu geladen wird.
Wie kann ich ändern @Html.AntiForgeryToken()
, um ein Token für den neuen, authentifizierten Benutzer zurückzugeben?
Ich füge jedem einen neuen GenericalPrincipal
mit einem benutzerdefinierten IIdentity
Wert hinzu Application_AuthenticateRequest
, wenn der @Html.AntiForgeryToken()
Aufruf HttpContext.Current.User.Identity
erfolgt. Tatsächlich ist meine benutzerdefinierte Identität mit der IsAuthenticated
Eigenschaft true festgelegt und @Html.AntiForgeryToken
scheint dennoch ein Token für den alten Benutzer zu rendern, es sei denn, ich lade die Seite neu.
quelle
Antworten:
Dies geschieht, weil das Anti-Fälschungs-Token den Benutzernamen des Benutzers zur besseren Validierung als Teil des verschlüsselten Tokens einbettet. Wenn Sie
@Html.AntiForgeryToken()
den Benutzer zum ersten Mal anrufen, ist er nicht angemeldet, sodass das Token eine leere Zeichenfolge für den Benutzernamen hat. Wenn Sie das Anti-Fälschungs-Token nicht ersetzen, wird die Validierung nicht bestanden, da das ursprüngliche Token für war anonymer Benutzer und jetzt haben wir einen authentifizierten Benutzer mit einem bekannten Benutzernamen.Sie haben einige Möglichkeiten, um dieses Problem zu lösen:
Lassen Sie Ihr SPA diesmal einen vollständigen POST durchführen. Wenn die Seite neu geladen wird, wird ein Fälschungsschutz-Token mit dem aktualisierten, eingebetteten Benutzernamen angezeigt.
Machen Sie eine Teilansicht mit direkt
@Html.AntiForgeryToken()
und direkt nach dem Anmelden, führen Sie eine weitere AJAX-Anfrage durch und ersetzen Sie Ihr vorhandenes Fälschungsschutz-Token durch die Antwort auf die Anfrage.Deaktivieren Sie einfach die Identitätsprüfung, die die Fälschungssicherheitsüberprüfung durchführt. Fügen Sie Ihrer Application_Start- Methode Folgendes hinzu :
AntiForgeryConfig.SuppressIdentityHeuristicChecks = true
.quelle
Um den Fehler zu beheben, müssen Sie die
OutputCache
Datenanmerkung auf der Seite GetActionResult
of Login wie folgt platzieren:quelle
Es kommt oft mit meiner Bewerbung vor, deshalb habe ich mich für Google entschieden!
Ich habe eine einfache Erklärung für diesen Fehler gefunden! Der Benutzer doppelklickt auf die Schaltfläche zum Anmelden! Sie können einen anderen Benutzer sehen, der über den folgenden Link darüber spricht:
Das von MVC 4 bereitgestellte Anti-Fälschungs-Token war für den Benutzer "" gedacht, der aktuelle Benutzer ist jedoch "Benutzer".
Ich hoffe, es hilft! =)
quelle
Ich hatte das gleiche Problem und dieser schmutzige Hack hat es behoben, zumindest bis ich es sauberer beheben kann.
...
quelle
Die Meldung wird angezeigt, wenn Sie sich anmelden, wenn Sie bereits authentifiziert sind.
Dieser Helfer macht genau das Gleiche wie das
[ValidateAntiForgeryToken]
Attribut.Entfernen Sie das
[ValidateAntiForgeryToken]
Attribut vom Controller und setzen Sie diesen Helfer in die Aktionsmethode.Wenn der Benutzer bereits authentifiziert ist, leiten Sie ihn zur Startseite weiter oder fahren Sie nach dieser Überprüfung mit der Überprüfung des gültigen Fälschungsschutz-Tokens fort.
quelle
Ich habe die gleiche Ausnahme, die die meiste Zeit auf dem Produktionsserver auftritt.
Warum passiert das?
Dies geschieht, wenn sich ein Benutzer mit gültigen Anmeldeinformationen anmeldet und einmal angemeldet ist und auf eine andere Seite umleitet. Wenn er auf die Schaltfläche "Zurück" klickt, wird die Anmeldeseite angezeigt, und er hat zu diesem Zeitpunkt erneut gültige Anmeldeinformationen eingegeben.
Wie löst man?
Fügen Sie einfach diese Zeile hinzu und arbeiten Sie perfekt, ohne einen Fehler zu erhalten.
quelle
Ich hatte ein ziemlich spezifisches, aber ähnliches Problem bei der Registrierung. Sobald der Benutzer auf den an ihn gesendeten E-Mail-Link geklickt hat, wird er angemeldet und direkt an einen Bildschirm mit Kontodetails gesendet, um weitere Informationen einzugeben. Mein Code war:
Ich habe festgestellt, dass die Rückgabeansicht ("AccountDetails") mir die Token-Ausnahme gab. Ich vermute, dass die ConfirmEmail-Funktion mit AllowAnonymous dekoriert war, die AccountDetails-Funktion jedoch ValidateAntiForgeryToken hatte.
Das Ändern von Return to Return RedirectToAction ("AccountDetails") hat das Problem für mich gelöst.
quelle
Sie können dies testen, indem Sie in der ersten Zeile Ihrer Anmeldeaktion (Abrufen) einen Haltepunkt setzen. Vor dem Hinzufügen der OutputCache-Direktive wird der Haltepunkt beim ersten Laden erreicht, nach dem Klicken auf die Schaltfläche "Zurück" des Browsers jedoch nicht. Nach dem Hinzufügen der Direktive sollte der Haltepunkt jedes Mal erreicht werden, damit das AntiForgeryToken das richtige und nicht das leere ist.
quelle
Ich hatte das gleiche Problem mit einer einseitigen ASP.NET MVC Core-Anwendung. Ich habe es behoben, indem ich
HttpContext.User
alle Controller-Aktionen festgelegt habe, die die aktuellen Identitätsansprüche ändern (da MVC dies nur für nachfolgende Anforderungen tut, wie hier erläutert ). Ich habe anstelle der Middleware einen Ergebnisfilter verwendet, um die Antiforgery-Cookies an meine Antworten anzuhängen. Dadurch wurde sichergestellt, dass sie erst generiert wurden, nachdem die MVC-Aktion zurückgekehrt war.Controller (Hinweis: Ich verwalte Benutzer mit ASP.NET Core Identity):
Ergebnisfilter zum Anhängen von Antiforgery-Cookies:
Startup.cs extrahieren:
quelle
Hat ein Problem mit der Validierung von Anti-Fälschungs-Token im Internet-Shop: Benutzer öffnen viele Registerkarten (mit Waren) und versuchen, sich nach dem Anmelden bei einem anderen anzumelden, und erhalten eine solche AntiForgeryException. Also, AntiForgeryConfig.SuppressIdentityHeuristicChecks = true hat mir nicht geholfen, also habe ich solch einen hässlichen Hackfix verwendet, vielleicht ist es für jemanden hilfreich:
Ich denke, es ist großartig, wenn Optionen zur Generierung von Anti-Fälschungs-Token festgelegt werden können, um Benutzernamen oder ähnliches auszuschließen.
quelle