__RequestVerificationToken在Ajax POST中不存在

3

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

表单:

<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

1个回答

7
如果您将数据转换为字符串并使用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"]);
    }
}

在您的控制器方法中,将[ValidateAntiForgeryToken]属性替换为[ValidateHeaderAntiForgeryToken]


太好了!谢谢。 - Echilon
对我有用。谢谢! - Dumber_Texan2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接