我正在尝试对使用DevExpress网格的现有MVC4 Web应用程序进行CSRF保护。我已经将Html.AntiForgeryToken()添加到aspx页面上的表单中(其中包含ascx作为包含网格的部分),并且可以在调用保存时在开发人员工具中清楚地看到__RequestVerificationToken和它的值。
我已经尝试将我的所有ValidateAntiForgeryToken属性栏都注释掉了 - 为了简单起见,我使用了删除帖子方法(并且还消除了乱七八糟的DevExpress网格),我仍然不断遇到这个错误:
有一个HttpAntiForgeryException
异常消息是 所需的防伪表单字段“__RequestVerificationToken”不存在。
有谁知道为什么会这样?可能是错误是非描述性的,实际上令牌不匹配而不是它不存在?在以前对这个问题的回答中,人们只会说“哦,你必须添加令牌”,这在这里显然没有用。
答案 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(); }";