J'ai des problèmes avec l'AntiForgeryToken avec ajax. J'utilise ASP.NET MVC 3. J'ai essayé la solution dans les appels jQuery Ajax et le Html.AntiForgeryToken () . En utilisant cette solution, le jeton est maintenant passé:
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) {
...
}
});
Lorsque je supprime l' [ValidateAntiForgeryToken]
attribut juste pour voir si les données (avec le jeton) sont transmises en tant que paramètres au contrôleur, je peux voir qu'elles sont transmises. Mais pour une raison quelconque, le A required anti-forgery token was not supplied or was invalid.
message apparaît toujours lorsque je remets l'attribut.
Des idées?
ÉDITER
L'antiforgerytoken est généré dans un formulaire, mais je n'utilise pas d'action d'envoi pour le soumettre. Au lieu de cela, j'obtiens simplement la valeur du jeton en utilisant jquery, puis j'essaye d'ajax poster cela.
Voici le formulaire qui contient le jeton et se trouve sur la page maître supérieure:
<form id="__AjaxAntiForgeryForm" action="#" method="post">
@Html.AntiForgeryToken()
</form>
la source
contentType
toapplication/json
car le serveur s'attend à ce que le__RequestVerificationToken
paramètre fasse partie de la charge utile de la requête POST en utilisantapplication/x-www-form-urlencoded
.$(this).data('url'),
peut comprendre quelle serait l'url de mon contrôleur et de mon action. S'il vous plaît, expliquez. merciUne autre approche (moins javascript), que j'ai faite, va quelque chose comme ceci:
Tout d'abord, un assistant Html
qui renverra une chaîne
afin que nous puissions l'utiliser comme ça
Et cela semble fonctionner!
la source
@Html.AntiForgeryTokenForAjaxPost
en deux pour obtenir le nom du jeton dans une main et sa valeur dans l'autre. Sinon, la mise en évidence de la syntaxe est tout foirée. Cela se termine comme ceci (supprimant également les guillemets simples du résultat retourné, de sorte qu'il se comporte comme n'importe quel assistant MVC, par exemple @Url):'@Html.AntiForgeryTokenName' : '@Html.AntiForgeryTokenValue'
XElement.Parse(antiForgeryInputTag).Attribute("value").Value
var antiForgeryInputTag = helper.AntiForgeryToken().ToString(); return XElement.Parse(antiForgeryInputTag).Attribute("value").Value
c'est si simple! lorsque vous utilisez
@Html.AntiForgeryToken()
dans votre code html, cela signifie que le serveur a signé cette page et que chaque demande envoyée au serveur à partir de cette page particulière a un signe qui est empêché d'envoyer une fausse demande par des pirates. donc pour que cette page soit authentifiée par le serveur, vous devez suivre deux étapes:1. envoyez un paramètre nommé
__RequestVerificationToken
et pour obtenir sa valeur, utilisez les codes ci-dessous:par exemple prendre un appel ajax
et étape 2, décorez simplement votre méthode d'action en
[ValidateAntiForgeryToken]
la source
Dans Asp.Net Core, vous pouvez demander le jeton directement, comme documenté :
Et utilisez-le en javascript:
Vous pouvez ajouter le filtre global recommandé, comme indiqué :
Mettre à jour
La solution ci-dessus fonctionne dans les scripts qui font partie du .cshtml. Si ce n'est pas le cas, vous ne pouvez pas l'utiliser directement. Ma solution était d'utiliser un champ caché pour stocker la valeur en premier.
Ma solution de contournement, toujours en utilisant
GetAntiXsrfRequestToken
:Lorsqu'il n'y a pas de formulaire:
L'
name
attribut peut être omis puisque j'utilise l'id
attribut.Chaque formulaire comprend ce jeton. Ainsi, au lieu d'ajouter une autre copie du même jeton dans un champ masqué, vous pouvez également rechercher un champ existant par
name
. Remarque: il peut y avoir plusieurs formulaires à l'intérieur d'un document, ilname
n'est donc pas unique dans ce cas. Contrairement à unid
attribut qui devrait être unique.Dans le script, recherchez par identifiant:
Une alternative, sans avoir à référencer le token, est de soumettre le formulaire avec script.
Exemple de formulaire:
Le jeton est automatiquement ajouté au formulaire en tant que champ masqué:
Et soumettez dans le script:
Ou en utilisant une méthode de publication:
la source
Dans Asp.Net MVC lorsque vous utilisez
@Html.AntiForgeryToken()
Razor crée un champ d'entrée masqué avec un nom__RequestVerificationToken
pour stocker les jetons. Si vous voulez écrire une implémentation AJAX, vous devez récupérer ce jeton vous-même et le transmettre en tant que paramètre au serveur afin qu'il puisse être validé.Étape 1: Obtenez le jeton
Étape 2: Passez le jeton dans l'appel AJAX
Remarque : le type de contenu doit être
'application/x-www-form-urlencoded; charset=utf-8'
J'ai téléchargé le projet sur Github; vous pouvez le télécharger et l'essayer.
https://github.com/lambda2016/AjaxValidateAntiForgeryToken
la source
la source
Je sais que c'est une vieille question. Mais je vais quand même ajouter ma réponse, peut-être aider quelqu'un comme moi.
Si vous ne souhaitez pas traiter le résultat de la post-action du contrôleur, comme appeler la
LoggOff
méthode duAccounts
contrôleur, vous pouvez faire comme la version suivante de la réponse de @DarinDimitrov:la source
Dans le contrôleur de compte:
En vue:
Il est important de mettre
contentType
à'application/x-www-form-urlencoded; charset=utf-8'
ou tout simplement omettrecontentType
de l'objet ...la source
J'ai essayé beaucoup de solutions de contournement et aucune n'a fonctionné pour moi. L'exception était "Le champ obligatoire du formulaire anti-contrefaçon" __RequestVerificationToken ".
Ce qui m'a aidé, c'est de passer du formulaire .ajax à .post:
la source
N'hésitez pas à utiliser la fonction ci-dessous:
}
la source
Le jeton ne fonctionnera pas s'il a été fourni par un autre contrôleur. Par exemple, cela ne fonctionnera pas si la vue a été renvoyée par le
Accounts
contrôleur, mais par vousPOST
auClients
contrôleur.la source