从 ajax 方法调用操作引发错误:所需的防伪表单字段“__RequestVerificationToken”不存在

Posted

技术标签:

【中文标题】从 ajax 方法调用操作引发错误:所需的防伪表单字段“__RequestVerificationToken”不存在【英文标题】:Invoking action from ajax method is throwing an error: The required anti-forgery form field "__RequestVerificationToken" is not present 【发布时间】:2019-07-07 03:06:20 【问题描述】:

我有以下从控制器触发动作方法的 ajax 方法。在执行以下方法时,我看到一个错误:所需的防伪表单字段“__RequestVerificationToken”不存在。但是在视图源中,我看到有一个表单字段“__RequestVerificationToken”,我将其传递给操作方法。

Test.cshtml:

<form action="javascript: void(0)" id="frmContent">
 @html.AntiForgeryToken()
</form>

<script type="text/javascript" charset="utf8">
  var vue_data = vue_data || ;

    (function () 
            var token = $('#frmContent input[name=__RequestVerificationToken]').val();
            $.ajax(
                    url: '@(Url.Action("GetData", "Test"))',
                    type: "POST",
                    cache: false,
                    async: false,
                    headers: 
                        "__RequestVerificationToken": token
                    ,
                    data:  search: $('#search').val(),
                    success: function (data) 
                        var items = jQuery.parseJSON(data);
                        vue_data.view_content = items.items;
                    
                );
            )();

</script>

TestController.cs

[ValidateHeaderAntiForgeryToken]
public JsonResult GetData(string search)


谁能帮我解决这个问题?

【问题讨论】:

使用防伪令牌的全部目的是确保表单数据不会在中间攻击中被人篡改,如果你可以在这里做你想做的事情,那么防伪令牌毫无意义。因为你正试图操纵它。它打算以提交的形式发送。这就是为什么你有 html 助手的原因,因为正在进行加密,所以当你尝试发送令牌时它失败了,因为它被改变了 【参考方案1】:

您还可以在数据中传递 antiforgerytoken。我以前用过它,它就像一个魅力。

 data:  "__RequestVerificationToken": token,"search": $('#search').val()

在您的 actionMethod 上使用: [验证AntiForgeryToken] 而且,这也行不通。 数据:搜索:$('#search').val() 请在搜索中使用引号: 数据:“__RequestVerificationToken”:令牌,“搜索”:$('#search').val()

【讨论】:

感谢 Abhishek 的回复。我根据您的回复尝试了相同的操作,但仍然抛出相同的错误。所需的防伪表单字段“__RequestVerificationToken”不存在。 请检查您是否获得了令牌中的值。同样在您的代码中,您将数据作为数据传递: search: $('#search').val(),它应该是 data: "__RequestVerificationToken": token,"search": $('#search') .val()

以上是关于从 ajax 方法调用操作引发错误:所需的防伪表单字段“__RequestVerificationToken”不存在的主要内容,如果未能解决你的问题,请参考以下文章

所需的防伪表单字段 __requestverificationtoken 不存在 ajax 调用时出错

所需的防伪表单字段“__RequestVerificationToken”不存在 用户注册错误

所需的防伪表单字段“__RequestVerificationToken”不存在

jmeter中的相关问题:所需的防伪形式字段“__RequestVerificationToken”不存在

所需的防伪 cookie“__RequestVerificationToken”不存在

即使缺少所需的值,Django 验证也会调用 clean()