Le champ de formulaire anti-falsification requirejs «__RequestVerificationToken» n’est pas présent dans l’appel ajax

J’ai la méthode suivante dans le contrôleur

[HttpPost] [Authorize(Roles ="Klient")] [ValidateAntiForgeryToken] public ActionResult GetAvaiableHouses(DateTime startDate, DateTime endDate) { Session.Remove("Reservation"); IEnumerable  avaiableHouses = repository.GetAllNamesAvaiableHouses(repository.GetAvaiableHousesInTerm(startDate, endDate)); List houses = new List(); avaiableHouses.ToList().ForEach(item => houses.Add(item.Value)); if(avaiableHouses.ToList().Count == 0) { return new EmptyResult(); } Session["Reservation"] = new NewReservation() { StartDate = startDate, EndDate = endDate, AvaiableHouses = avaiableHouses }; return PartialView("~/Views/Shared/_AvaiableHousesPartial.cshtml", houses); } 

Cette méthode est appelée à l’aide du script ajax dans View.cshtml.

 $(function () { $("#btnCheckAvaiableHouses").click(function () { $.ajax({ type: "POST", url: "/ClientReservations/GetAvaiableHouses", data: '{startDate: "' + $("#startdate").val() + '",endDate:"' + $("#enddate").val() + '",__RequestVerificationToken:"' + $('input[name=__RequestVerificationToken]').val() +'" }', contentType: "application/json; charset=utf-8", dataType: "text", success: function (response) { $('#avaiableHouses').html(response) if (!$('#avaiableHouses').is(':empty')) { document.getElementById("btnConfirmTerm").style.visibility = 'visible'; } else { $('#avaiableHouses').html('Brak dostępnych domków w podanym terminie') } }, failure: function (response) { alert(response.responseText); }, error: function (response) { alert(response.responseText); } }); }); }); 

Ceci est la section des boutons avec celle-ci qui appelle ce script

 

J’ai ajouté le paramètre supplémentaire

 '",__RequestVerificationToken:"' + $('input[name=__RequestVerificationToken]').val() 

dans un script ajax mais lors de l’exécution, je reçois toujours l’erreur

, __ RequestVerificationToken n’est pas présent.

Quelle pourrait être la raison?

Si vous codifiez les données et utilisez contentType: 'application/json , ajoutez le jeton aux en-têtes ajax, par exemple

 var headers = { __RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val() }; $.ajax({ headers: headers, data: ... // remove the token from your existing implementation .... }); 

et vous devez ensuite créer un FilterAtsortingbute personnalisé pour lire la valeur à partir des en-têtes.

 [AtsortingbuteUsage(AtsortingbuteTargets.Method | AtsortingbuteTargets.Class, AllowMultiple = false, Inherited = true)] public sealed class ValidateHeaderAntiForgeryTokenAtsortingbute : FilterAtsortingbute, IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { if (filterContext == null) { throw new ArgumentNullException("filterContext"); } var httpContext = filterContext.HttpContext; var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName]; AntiForgery.Validate(cookie != null ? cookie.Value : null, httpContext.Request.Headers["__RequestVerificationToken"]); } } 

et dans votre méthode de contrôleur, remplacez [ValidateAntiForgeryToken] par [ValidateHeaderAntiForgeryToken]

Cependant, il n’est pas nécessaire de hiérarchiser les données et vous pouvez utiliser

 var data = { startDate: $("#startdate").val(), endDate: $("#enddate").val(), __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val() }; $.ajax({ data: data, .... }); 

et supprimez l’option contentType pour qu’elle utilise la valeur par défaut 'application/x-www-form-urlencoded; charset=UTF-8' 'application/x-www-form-urlencoded; charset=UTF-8'

Vous n’avez pas montré votre formulaire, en supposant qu’il contienne @Html.AntiForgeryToken() et @Html.TextBoxFor(m => m.startDate) et @Html.TextBoxFor(m => m.endDate) pour que vous générez des contrôles de formulaire avec name="startDate" et name="endDate" , vous pouvez simplement utiliser

 var data = $('form').serialize(); $.ajax({ data: data, .... }); 

pour sérialiser tous vos contrôles de formulaire, y compris le jeton