当我在Developer工具中清楚地看到它时,“__RequestVerificationToken不存在”错误

时间:2016-07-27 10:30:16

标签: asp.net-mvc-4 antiforgerytoken devexpress-mvc

我正在尝试对使用DevExpress网格的现有MVC4 Web应用程序进行CSRF保护。我已经将Html.AntiForgeryToken()添加到aspx页面上的表单中(其中包含ascx作为包含网格的部分),并且可以在调用保存时在开发人员工具中清楚地看到__RequestVerificationToken和它的值。

我已经尝试将我的所有ValidateAntiForgeryToken属性栏都注释掉了 - 为了简单起见,我使用了删除帖子方法(并且还消除了乱七八糟的DevExpress网格),我仍然不断遇到这个错误:

  

有一个HttpAntiForgeryException

     

网址:http://localhost:54653/Users/Delete/f86ad393-0039-44e8-beed-a66dbab9266e?ReturnURL=http%3A%2F%2Flocalhost%3A54653%2FUsers

     

异常消息是   所需的防伪表单字段“__RequestVerificationToken”不存在。

有谁知道为什么会这样?可能是错误是非描述性的,实际上令牌不匹配而不是它不存在?在以前对这个问题的回答中,人们只会说“哦,你必须添加令牌”,这在这里显然没有用。

4 个答案:

答案 0 :(得分:0)

您是通过Ajax手动提交表单吗?如果是这种情况,则需要将防伪标记作为另一个参数传递,名称为" __ RequestVerificationToken"。

答案 1 :(得分:0)

第1点:确保您的应用程序是否具有https安全协议。请加载https。

第2点:如果是DevExpress,你必须调用以下模式。

ViewContext.Writer.Write(Html.AntiForgeryToken().ToHtmlString());

答案 2 :(得分:0)

经过几天的努力,我有一个想法 - 也许浏览器正在停止写入cookie。我搜索了未编写的开发服务器和cookie,发现使用Chrome和IE10以及编写cookie时出现了问题。

我下载了Firefox并尝试使用它,它立即 。然后,我将所有验证属性重新应用于所有控制器方法,并且所有这些都是有效的,每一个都是有效的!即使是DexExpress回发似乎也能正常工作。

我会进行更详尽的测试,但就目前而言,我认为我们会在那里进行。

答案 3 :(得分:0)

不完全是。如果已在使用MvcxGridView的页面上定义了MVC AntiForgeryToken,并且您希望保护网格操作,则应在网格客户端开始回调事件期间将此令牌发送回服务器。

    settings.ClientSideEvents.BeginCallback = "function(s,e) { e.customArgs[\"__RequestVerificationToken\"] = $('input[name=\"__RequestVerificationToken\"]',  $(s.GetMainElement())).val(); }";