J'utilise la fonction utilisateur Membership.create
, puis l'erreur suivante se produit,
Le champ de formulaire anti-falsification requis "__RequestVerificationToken" est pas présent
Comment puis-je réparer cela?
Vous avez l'attribut [ValidateAntiForgeryToken]
avant votre action. Vous devez également ajouter @Html.AntiForgeryToken()
dans votre formulaire.
Dans mon cas, j'avais ceci dans mon web.config:
<httpCookies requireSSL="true" />
Mais mon projet était configuré pour ne pas utiliser SSL. Commenter cette ligne ou configurer le projet pour qu'il utilise toujours SSL l'a résolu.
Comme ça:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
Veillez également à ne pas utiliser [ValidateAntiForgeryToken] Sous [HttpGet].
[HttpGet]
public ActionResult MethodName()
{
..
}
Vous recevrez le message d'erreur même si les cookies ne sont pas activés.
Une autre chose qui peut causer ceci (juste couru dans ceci) est la suivante: __. lorsque le formulaire sera envoyé en retour, la valeur du jeton sera manquante et générera l'erreur. vous devez donc réactiver le champ de saisie contenant le jeton de vérification et tout ira bien.
Une autre possibilité pour ceux d’entre nous qui téléchargent des fichiers dans le cadre de la demande. Si la longueur du contenu dépasse <httpRuntime maxRequestLength="size in kilo bytes" />
et si vous utilisez des jetons de vérification de la demande, le navigateur affiche le message 'The required anti-forgery form field "__RequestVerificationToken" is not present'
au lieu du message dépassant la longueur de la demande.
Définir maxRequestLength sur une valeur suffisamment grande pour répondre à la demande résout le problème immédiat - bien que je reconnaisse que ce n'est pas une solution appropriée (nous voulons que l'utilisateur connaisse le véritable problème de la taille du fichier, pas celui des jetons de vérification de la demande manquants).
Assurez-vous que votre attribut http est dans votre contrôleur:
[HttpPost]
ajoutez également l'attribut dans le contrôleur:
[ValidateAntiForgeryToken]
Sur votre formulaire, à votre avis, vous devez écrire:
@Html.AntiForgeryToken();
J'ai eu Html.AntiForgeryToken (); sans le signe @ alors qu'il était dans un bloc de code, cela n'a pas donné d'erreur dans Razor mais l'a été à l'exécution Assurez-vous de regarder le signe @ de @ Html.Ant .. s'il est manquant ou non
Dans mon cas, j'ai eu ce javascript sur le formulaire de soumission:
$('form').submit(function () {
$('input').prop('disabled', true);
});
Cela supprimait le RequestVerificationToken caché du formulaire soumis. J'ai changé cela en:
$('form').submit(function () {
$('input[type=submit]').prop('disabled', true);
$('input[type=text]').prop('readonly', true);
$('input[type=password]').prop('readonly', true);
});
... et ça a bien fonctionné.
Si quelqu'un rencontre l'erreur pour la même raison que moi, voici ma solution:
si vous aviez Html.AntiForgeryToken();
changez-le en @Html.AntiForgeryToken()
Dans mon cas, le domaine incorrect dans web.config pour les cookies était la raison:
<httpCookies domain=".wrong.domain.com" />
Parce que cela vient avec la première recherche de ceci:
J'avais ce problème uniquement dans Internet Explorer et je ne pouvais pas comprendre en quoi il consistait. Pour résumer, il ne s’agissait pas de sauvegarder la partie cookie du Token car notre (sous) domaine comportait un trait de soulignement. Travaillé dans Chrome mais IE/Edge ne l'a pas aimé.
Dans ma solution EPiServer sur plusieurs contrôleurs, il y avait un attribut ContentOutputCache sur l'action Index qui acceptait HttpGet. Chaque vue de ces actions contenait un formulaire qui était enregistré sur une action HttpPost sur le même contrôleur ou sur un autre. Dès que j'ai supprimé cet attribut de toutes ces actions d'index, le problème a disparu.
Dans mon cas, je rencontrais cette erreur en écrivant un message AJAX. Il s'est avéré que la valeur __RequestVerificationToken n'était pas transmise lors de l'appel. Je devais trouver manuellement la valeur de ce champ et le définir en tant que propriété de l'objet de données envoyé au noeud final.
c'est-à-dire data.__RequestVerificationToken = $('input[name="__RequestVerificationToken"]').val();
HTML
<form id="myForm">
@Html.AntiForgeryToken()
<!-- other input fields -->
<input type="submit" class="submitButton" value="Submit" />
</form>
Javascript
$(document).on('click', '#myForm .submitButton', function () {
var myData = { ... };
myData.__RequestVerificationToken = $('#myForm input[name="__RequestVerificationToken"]').val();
$.ajax({
type: 'POST',
url: myUrl,
data: myData,
contentType: 'application/x-www-form-urlencoded; charset=utf-8',
dataType: 'json',
success: function (response) {
alert('Form submitted');
},
error: function (e) {
console.error('Error submitting form', e);
alert('Error submitting form');
},
});
return false; //prevent form reload
});
contrôleur
[HttpPost]
[Route("myUrl")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> MyUrlAsync(MyDto dto)
{
...
}
Parfois, vous écrivez une méthode d'action de formulaire avec une liste de résultats. Dans ce cas, vous ne pouvez pas utiliser une seule méthode d'action. Donc, vous devez avoir deux méthodes d'action avec le même nom. Un avec [HttpGet]
et un autre avec l'attribut [HttpPost]
.
Dans votre méthode d'action [HttpPost]
, définissez l'attribut [ValidateAntiForgeryToken]
et mettez également @Html.AntiForgeryToken()
dans votre formulaire HTML.
Dans mon cas, cela était dû à l'ajout de requireSSL=true
à httpcookies
dans webconfig, ce qui a empêché AntiForgeryToken de fonctionner. Exemple:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>
Pour que requireSSL=true
et @Html.AntiForgeryToken()
fonctionnent, j'ai ajouté cette ligne dans le Application_BeginRequest
dans Global.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
}
Toutes les autres réponses ici sont également valables, mais si aucune d’entre elles ne résout le problème, il convient également de vérifier que les en-têtes réels sont transmis au serveur.
Par exemple, dans un environnement à charge équilibrée derrière nginx, la configuration par défaut consiste à supprimer l’en-tête __RequestVerificationToken avant de transmettre la demande au serveur, voir: le proxy inverse nginx simple semble supprimer certains en-têtes