在ASP.NET MVC中将ValidateAntiForgeryToken与JQGrid一起使用?

时间:2018-08-20 14:08:17

标签: asp.net-mvc jqgrid

在混合的asp.net Web窗体/ mvc 5.2.6应用程序中,使用JQuery.jqGrid v4.4.4,我正在努力寻找一种方法,用于在jqGrid发布时获取的Controller方法上使用ValidateAntiForgeryToken属性数据。

网格是只读的。 “数据类型”为“ json”,“ mtype”为“ POST”。我只是尝试将__RequestVerificationToken隐藏输入的值附加到要回传到Controller的数据上,但这不起作用。该网站只会引发缺少的防伪令牌异常。

我注意到,当要向控制器方法发送json数据的$ .ajax发布时,可以在“ headers”参数中传递__RequestVerificationToken。尽管jqGrid在后台进行$ .ajax调用,但不幸的是它没有headers参数。

我在SO上找到了可以通过editData参数传递令牌的示例(例如:JQGrid able to pass ValidateAntiForgeryToken through the main CRUD controls?),但是我的网格是只读的,无论如何我都想强制执行令牌当用户输入搜索条件,然后单击按钮填充网格时。

在填充jqgrid时,有什么方法可以使用ValidateAntiForgeryToken吗?

2 个答案:

答案 0 :(得分:1)

您可以将postData参数的__RequestVerificationToken属性定义为以下功能:

postData: {
    __RequestVerificationToken: function () {
        return jQuery("input[name=__RequestVerificationToken]").val();
    }
}

它将在填充网格期间向所有发送到服务器的请求添加__RequestVerificationToken参数。

答案 1 :(得分:0)

Oleg的答案对我来说是正确的答案,但我也从https://github.com/VahidN/jqGrid-Samples/blob/master/jqGrid04/jqGrid04/Views/Home/Index.cshtml的广泛解决方案中大跌眼镜,该解决方案将验证令牌添加到每个ajax POST:

$(document).ajaxSend(function (elm, xhr, s) {
        let securityToken = $('[name=__RequestVerificationToken]').val();
        if (s.type === 'POST' && typeof securityToken != 'undefined') {
            if (s.data.length > 0) {
                s.data += "&__RequestVerificationToken=" + encodeURIComponent(securityToken);
            }
            else {
                s.data = "__RequestVerificationToken=" + encodeURIComponent(securityToken);
            }
        }
    });