【问题标题】:AntiforgeryToken Not Recognized In Ajax CallAjax 调用中无法识别 AntiforgeryToken
【发布时间】:2016-07-18 11:54:33
【问题描述】:

我有一个场景,我不需要通过 ajax 调用发送表单数据而是其他一些数据。我有一个包含 html.AntiForgeryToken() 的表单。

这是我尝试过的。

var modid = $("#moduleList").val();
var data = {};
data.modid = modid;

var token = $('#frmmmenu input[name="__RequestVerificationToken"]').val();
data.__RequestVerificationToken = token;
//var dataWithToken = $.extend(data, token);
$.ajax({
    type: "POST",
    url: "Home/MainMenu",
    data: JSON.stringify(data),
    //contentType: "application/json; charset=utf-8",  // request data type
    dataType: "html",  // response data type
    success: function (msg) {

        $("#accordion").html(msg);
    },
    error: function (msg) {
        alert("Ajax Error");
    },
});

但我不断收到The required anti-forgery form field "__RequestVerificationToken" is not present。错误。

这是 Firebug 屏幕截图

我的操作方法也用 ValidateAntiForgeryToken 修饰

[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public ActionResult MainMenu(int modid)
{
}

这是什么原因造成的?有什么想法吗?

编辑: 这是一个 MVC5 项目。

【问题讨论】:

  • @RoryMcCrossan 与萤火虫帖子中的值相同。
  • 看看this的回答。
  • ValidationAntiForgeryTokeAttribute 不支持来自 JSON 的令牌。 Kayess 的答案没有将值编码为 JSON,该答案使用 Form Encoded 值。
  • @ErikPhilips 没错!就我而言,我没有序列化表单并从头开始创建对象。发送 JSON 的旧习惯导致错误:(
  • 我只使用JSON,所以我从属性中派生出来,自己写。除非你做的是非常基本的事情,否则标准的 URL 编码非常糟糕。

标签: jquery ajax asp.net-mvc csrf antiforgerytoken


【解决方案1】:

对我来说,我必须先尝试所有帖子,然后才能找到可行的解决方案:

JS

var form = jQuery("#AuthForm");
form.children("input[name=provider]").val(source.SourceName);
form.children("input[name=returnUrl]").val(window.location.href);

$.ajax({
 url: form.attr('action'),
 data: form.serialize(),
 success: function (response) {
  console.log(response);
 }
});

显然,我填写的值(.val() 语句)是针对我的情况的。另外,我正在一个有角度的应用程序中运行它。

CSHTML

<form id="AuthForm" action="@Url.Action("LinkExternalLogin","LoginInfo")" method="post">
 @Html.AntiForgeryToken()
 <input type="hidden" name="provider" value="" />
 <input type="submit" name="returnUrl" value="" />
</form>

【讨论】:

    【解决方案2】:

    找到了解决方案。

    罪魁祸首是

    data: JSON.stringify(data),
    

    将以上内容改为

    data: data,
    

    现在 Firebug 显示

    希望有人可以使用 JSON 发布解决方案,因为 Url 长度有限,尽管它需要 contentType application/x-www-form-urlencoded

    感谢大家的支持。

    【讨论】:

    • 当前解决方案很好:URL 长度是有限的,但是当您通过 jQuey AJAX 发布时,您没有使用该 URL。您可能正在使用“url 编码”内容,但这只是意味着它遵循与 URL 编码相同的结构(与 JSON、CSV 或其他内容相反)。它仍然包含在消息正文中,而不是 URL。
    • @binderbound 谢谢 从来没有新的。
    猜你喜欢
    • 1970-01-01
    • 2012-10-18
    • 2021-01-31
    • 2019-11-18
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多