web-dev-qa-db-fra.com

Le champ de formulaire anti-falsification requis "__RequestVerificationToken" n'est pas présent Erreur lors de l'enregistrement de l'utilisateur

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?

129
Hemant Soni

Vous avez l'attribut [ValidateAntiForgeryToken] avant votre action. Vous devez également ajouter @Html.AntiForgeryToken() dans votre formulaire.

199
webdeveloper

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.

68
Justin Skiles

Comme ça:

Le controlle

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
     ...
     Code Block
     ...
}

La vue:

@using(Html.BeginForm())
{
     @Html.AntiForgeryToken()
     <input name="..." type="text" />
     // rest
}
59
Subrata Sarkar

Veillez également à ne pas utiliser [ValidateAntiForgeryToken] Sous [HttpGet].

  [HttpGet]
  public ActionResult MethodName()
  {
  ..
  }
35
Haiping Fan

Vous recevrez le message d'erreur même si les cookies ne sont pas activés. 

7
Vijaychandar

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.

6
Roman

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).

5
GeoffM

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

4
juFo

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é.

4
Sean

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()

3
Winnifred

Dans mon cas, le domaine incorrect dans web.config pour les cookies était la raison:

<httpCookies domain=".wrong.domain.com" />
2
Michael Logutov

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é. 

0
dz15

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.

0
Goran Sneperger

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();


Exemple

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)
    {
        ...
    }
0
demoncodemonkey

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.

0
Masoud Darvishian

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;
  }
0
Ege Bayrak

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

0
Doug