0

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

我已经尝试注释掉我所有的 ValidateAntiForgeryToken 属性栏一个 - 为了简单起见,我使用了 delete post 方法(并且还消除了 DevExpress 网格的干扰),但我仍然遇到这个错误:

有一个 HttpAntiForgeryException

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

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

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

4

4 回答 4

1

您是否通过 Ajax 手动提交表单?如果是这种情况,您需要将防伪令牌作为另一个名为“__RequestVerificationToken”的参数传递。

于 2016-07-29T06:53:53.707 回答
0

在为此苦苦挣扎了几天之后,我想到了——也许浏览器正在停止写入 cookie。我搜索了没有写入的开发服务器和 cookie,发现在 Chrome 和 IE10 及更高版本中写入 cookie 存在问题。

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

我将进行更详尽的测试,但就目前而言,我认为我们已经完成了。

于 2016-08-01T15:15:57.773 回答
0

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

    settings.ClientSideEvents.BeginCallback = "function(s,e) { e.customArgs[\"__RequestVerificationToken\"] = $('input[name=\"__RequestVerificationToken\"]',  $(s.GetMainElement())).val(); }";
于 2016-08-08T12:36:44.167 回答
0

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

第 2 点:在 DevExpress 的情况下,您必须按照以下模式调用。

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

于 2016-07-29T06:59:10.887 回答