Ich habe Probleme mit dem AntiForgeryToken mit Ajax. Ich verwende ASP.NET MVC 3. Ich habe die Lösung in jQuery Ajax-Aufrufen und im Html.AntiForgeryToken () ausprobiert . Mit dieser Lösung wird das Token jetzt übergeben:
var data = { ... } // with token, key is '__RequestVerificationToken'
$.ajax({
type: "POST",
data: data,
datatype: "json",
traditional: true,
contentType: "application/json; charset=utf-8",
url: myURL,
success: function (response) {
...
},
error: function (response) {
...
}
});
Wenn ich das [ValidateAntiForgeryToken]
Attribut entferne , um zu sehen, ob die Daten (mit dem Token) als Parameter an die Steuerung übergeben werden, kann ich sehen, dass sie übergeben werden. Aber aus irgendeinem Grund wird die A required anti-forgery token was not supplied or was invalid.
Nachricht immer noch angezeigt, wenn ich das Attribut zurücksetze.
Irgendwelche Ideen?
BEARBEITEN
Das Antiforgerytoken wird in einem Formular generiert, aber ich verwende keine Übermittlungsaktion, um es abzusenden. Stattdessen erhalte ich nur den Wert des Tokens mit jquery und versuche dann, ihn zu posten.
Hier ist das Formular, das das Token enthält und sich auf der oberen Masterseite befindet:
<form id="__AjaxAntiForgeryForm" action="#" method="post">
@Html.AntiForgeryToken()
</form>
quelle
contentType
,application/json
da der Server erwartet, dass der__RequestVerificationToken
Parameter Teil der POST-Anforderungsnutzlast ist, die verwendet wirdapplication/x-www-form-urlencoded
.$(this).data('url'),
verstehen, wie die URL meines Controllers und meiner Aktion lauten würde? bitte erkläre. dankeEin anderer (weniger javascriptischer) Ansatz, den ich gemacht habe, geht ungefähr so:
Zuerst ein HTML-Helfer
das wird eine Zeichenfolge zurückgeben
so können wir es so verwenden
Und es scheint zu funktionieren!
quelle
@Html.AntiForgeryTokenForAjaxPost
in zwei Teile geteilt , um den Token-Namen in der einen und den Wert in der anderen Hand zu erhalten. Andernfalls ist das Syntax-Highlight völlig durcheinander. Es endet so (entfernte auch die einfachen Anführungszeichen aus dem zurückgegebenen Ergebnis, so dass es sich wie jeder MVC-Helfer verhält, zum Beispiel @Url):'@Html.AntiForgeryTokenName' : '@Html.AntiForgeryTokenValue'
XElement.Parse(antiForgeryInputTag).Attribute("value").Value
var antiForgeryInputTag = helper.AntiForgeryToken().ToString(); return XElement.Parse(antiForgeryInputTag).Attribute("value").Value
es ist so einfach! Wenn Sie
@Html.AntiForgeryToken()
in Ihrem HTML-Code verwenden, bedeutet dies, dass der Server diese Seite signiert hat und jede Anfrage, die von dieser bestimmten Seite an den Server gesendet wird, ein Zeichen hat, das verhindert, dass Hacker eine gefälschte Anfrage senden. Damit diese Seite vom Server authentifiziert wird, müssen Sie zwei Schritte ausführen:1.Senden Sie einen Parameter mit dem Namen
__RequestVerificationToken
und verwenden Sie die folgenden Codes, um seinen Wert abzurufen :Nehmen Sie zum Beispiel einen Ajax-Anruf entgegen
und Schritt 2 dekorieren Sie einfach Ihre Aktionsmethode mit
[ValidateAntiForgeryToken]
quelle
In Asp.Net Core können Sie das Token direkt anfordern, wie dokumentiert :
Und verwenden Sie es in Javascript:
Sie können den empfohlenen globalen Filter wie folgt hinzufügen :
Aktualisieren
Die obige Lösung funktioniert in Skripten, die Teil der .cshtml sind. Wenn dies nicht der Fall ist, können Sie dies nicht direkt verwenden. Meine Lösung bestand darin, ein verstecktes Feld zu verwenden, um den Wert zuerst zu speichern.
Meine Problemumgehung verwendet immer noch
GetAntiXsrfRequestToken
:Wenn es keine Form gibt:
Das
name
Attribut kann weggelassen werden, da ich dasid
Attribut verwende.Jedes Formular enthält dieses Token. Anstatt also eine weitere Kopie desselben Tokens in ein verstecktes Feld einzufügen, können Sie auch nach einem vorhandenen Feld suchen
name
. Bitte beachten Sie: Ein Dokument kann mehrere Formulare enthalten undname
ist in diesem Fall nicht eindeutig. Im Gegensatz zu einemid
Attribut , das sollte eindeutig sein.Suchen Sie im Skript nach ID:
Eine Alternative, ohne auf das Token verweisen zu müssen, besteht darin, das Formular mit einem Skript zu senden.
Musterformular:
Das Token wird dem Formular automatisch als verstecktes Feld hinzugefügt:
Und im Skript einreichen:
Oder mit einer Post-Methode:
quelle
In Asp.Net MVC wird bei Verwendung von
@Html.AntiForgeryToken()
Razor ein verstecktes Eingabefeld mit Namen__RequestVerificationToken
zum Speichern von Token erstellt. Wenn Sie eine AJAX-Implementierung schreiben möchten, müssen Sie dieses Token selbst abrufen und als Parameter an den Server übergeben, damit es validiert werden kann.Schritt 1: Holen Sie sich den Token
Schritt 2: Übergeben Sie das Token im AJAX-Aufruf
Hinweis : Der Inhaltstyp sollte sein
'application/x-www-form-urlencoded; charset=utf-8'
Ich habe das Projekt auf Github hochgeladen. Sie können es herunterladen und ausprobieren.
https://github.com/lambda2016/AjaxValidateAntiForgeryToken
quelle
quelle
Ich weiß, dass dies eine alte Frage ist. Aber ich werde trotzdem meine Antwort hinzufügen, könnte jemandem wie mir helfen.
Wenn Sie das Ergebnis der Post-Aktion
LoggOff
desAccounts
Controllers nicht verarbeiten möchten, wie z. B. das Aufrufen der Controller- Methode , können Sie die folgende Version der Antwort von @DarinDimitrov wie folgt ausführen:quelle
Im Account Controller:
Im Hinblick auf:
Es ist wichtig zu Satz
contentType
auf'application/x-www-form-urlencoded; charset=utf-8'
oder weglassencontentType
von dem Objekt ...quelle
Ich habe viele Workarrounds ausprobiert und keiner von ihnen hat für mich funktioniert. Die Ausnahme war "Das erforderliche Feld für Fälschungsschutz" __RequestVerificationToken ".
Was mir geholfen hat, war, von .ajax zu .post zu wechseln:
quelle
Fühlen Sie sich frei, die folgende Funktion zu nutzen:
}}
quelle
Das Token funktioniert nicht, wenn es von einem anderen Controller bereitgestellt wurde. ZB funktioniert es nicht, wenn die Ansicht vom
Accounts
Controller zurückgegeben wurde, aber SiePOST
zumClients
Controller.quelle