2017-09-28 144 views
1

我正在使用jQuery DataTales从MVC5请求POST URL并尝试添加防伪标记。我已经将它添加到头文件和请求正文中,但仍然收到500错误:“所需的防伪表单字段”__RequestVerificationToken“不存在。”__RequestVerificationToken与Ajax POST不存在

形式:

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

中的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

回答

0

如果哟你将数据字符串化并使用contentType: 'application/json,然后只将该标记添加到ajax标头(它不会从主体读取)。

你,那么你需要创建一个自定义FilterAttribute从头

[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"]); 
    } 
} 

,并在控制器方法读取的值,用[ValidateHeaderAntiForgeryToken]

+0

优秀更换[ValidateAntiForgeryToken]属性!谢谢。 – Echilon

相关问题