【问题标题】:"__RequestVerificationToken is not present" error when I can clearly see it in Developer tools“__RequestVerificationToken 不存在”错误,当我可以在开发者工具中清楚地看到它时
【发布时间】:2016-12-01 07:33:31
【问题描述】:

我正在尝试对使用 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”不存在。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 不完全是。我已经尝试从 DexExpress 网格手动提交,但不幸的是,我正在处理的应用程序结合使用 MVC 操作方法和带有 DevExpress 网格的部分视图(旧样式,使用 .ascx 文件作为部分)所以我必须为两种写回数据的方法添加标记。我现在正在努力克服它!
    【解决方案2】:

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

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

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

    【讨论】:

    • 该应用可以直接部署在本地内网,也可以作为SSL使用。不过,这应该不会影响防伪令牌的写入,不是吗?
    • 感谢您使用 ViewContext 编写令牌的建议。我会尝试一下,看看会发生什么。
    【解决方案3】:

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

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

    我会进行更详尽的测试,但现在,我想我们已经完成了。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-13
        • 1970-01-01
        • 1970-01-01
        • 2015-06-10
        • 2018-10-13
        • 1970-01-01
        • 2012-03-12
        相关资源
        最近更新 更多