2017-09-28 6 views
1

J'utilise jQuery DataTales pour demander une URL POST à ​​MVC5 et essayer d'ajouter un jeton anti-falsification. Je l'ai ajouté à la fois aux en-têtes et au corps de la requête, mais je reçois toujours une erreur 500: "Le champ de formulaire anti-falsification requis" __RequestVerificationToken "n'est pas présent."__RequestVerificationToken n'est pas présent avec Ajax POST

La forme:

<form id="my-units-form" action="@Url.Action("MyUnitsResults", "Provider")" class="form-horizontal criteria well well-sm"> 
    @Html.AntiForgeryToken() 
    .... 

Le JavaScript:

$userDt = $('#users-table') 
    .DataTable({ 
     serverSide: true, 
     ordering: false, 
     searching: true, 
     ajax: { 
      "url": url, 
      "type": "POST", 
      'contentType': 'application/json', 
      "dataType": "json", 
      headers: { '__RequestVerificationToken': $('form input[name=__RequestVerificationToken]').val() }, 
      data: function (d) { 
       d.__RequestVerificationToken= $('form input[name=__RequestVerificationToken]').val(); 

       return JSON.stringify(d); 
      } 
     }, 

Headers

Payload

Répondre

0

Si yo ur stringification des données et en utilisant contentType: 'application/json, puis ajouter le jeton aux en-têtes ajax seulement (il ne sera pas lu du corps).

Vous vous devez créer un FilterAttribute sur mesure pour lire la valeur des en-têtes

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)] 
public sealed class ValidateHeaderAntiForgeryTokenAttribute : FilterAttribute, 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 du contrôleur, remplacez l'attribut [ValidateAntiForgeryToken] avec [ValidateHeaderAntiForgeryToken]

+0

Excellent! Merci. – Echilon