156 votes

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

J'utilise Membership.create l'erreur suivante se produit,

Le champ requis du formulaire anti-falsification "__RequestVerificationToken" n'est pas pas présent

Comment puis-je résoudre ce problème ?

0voto

Ran Lorch Points 33

Je voudrais partager la mienne, j'ai suivi ce projet. Tutoriel sur l'anti-falsification des jetons j'utilise asp.net mvc 4 avec angularjs, mais il y a une exception à chaque fois que je fais une requête en utilisant $http.post et j'ai compris que la solution est juste d'ajouter X-Requested-With' : 'XMLHttpRequest' aux en-têtes de $http.post, parce qu'il semble que le (filterContext.HttpContext.Request.IsAjaxRequest()) ne le reconnaît pas comme ajax et voici mon code d'exemple.

App.js

var headers = { 'X-Requested-With': 'XMLHttpRequest', 'RequestVerificationToken': $scope.token, 'Content-Type': 'application/json; charset=utf-8;' };

$http({ method: 'POST', url: baseURL + 'Save/User', data: JSON.stringify($scope.formData), headers: headers }).then(function (values) { alert(values.data); }).catch(function (err) { console.log(err.data); });


SaveController

[HttpPost] [MyValidateAntiForgeryToken] public ActionResult User(UserModel usermodel) { ....

0voto

kevhann80 Points 312

Parce qu'il apparaît lors de la première recherche :

Je n'ai rencontré ce problème qu'avec Internet Explorer et je n'ai pas réussi à comprendre de quoi il s'agissait. Pour faire court, il ne sauvegardait pas la partie cookie du Token parce que notre (sous-)domaine contenait un trait de soulignement. Cela fonctionnait dans Chrome mais IE/Edge n'aimait pas ça.

0voto

Masoud Darvishian Points 910

Parfois, vous écrivez une méthode d'action de formulaire avec une liste de résultats. Dans ce cas, vous ne pouvez pas travailler avec une seule méthode d'action. Vous devez donc avoir deux méthodes d'action portant le même nom. L'une avec [HttpGet] et un autre avec [HttpPost] attribut.

Dans votre [HttpPost] méthode d'action, définir [ValidateAntiForgeryToken] et mettre également l'attribut @Html.AntiForgeryToken() dans votre formulaire html.

0voto

demoncodemonkey Points 4812

Dans mon cas, j'ai obtenu cette erreur lors de la création d'un message AJAX. __RequestVerificationToken la valeur n'était pas transmise lors de l'appel. J'ai dû trouver manuellement la valeur de ce champ et la définir comme une propriété de l'objet de données envoyé au point de terminaison.

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

0voto

J'ai résolu le problème de la manière suivante

[AttributeUsage(AttributeTargets.Method)]
public class ExcludeFromAntiForgeryValidationAttribute : Attribute{
}

et lieu System.Web.Helpers.AntiForgery.Validate(cookie != null ? cookie.Value : null, formToken) dans la condition "if

bool shouldValidate =!filterContext.ActionDescriptor.GetCustomAttributes(typeof(ExcludeFromAntiForgeryValidationAttribute), true).Any();
if (shouldValidate){
    System.Web.Helpers.AntiForgery.Validate(cookie != null ? cookie.Value : null, formToken);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X