Ajax 调用中无法识别 AntiforgeryToken

Posted

技术标签:

【中文标题】Ajax 调用中无法识别 AntiforgeryToken【英文标题】:AntiforgeryToken Not Recognized In Ajax Call 【发布时间】: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 编码非常糟糕。 【参考方案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 谢谢 从来没有新的。

以上是关于Ajax 调用中无法识别 AntiforgeryToken的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 似乎无法识别具有 Ajax 调用状态码 403 的不同字符串

HTML中的Vue JS无法识别添加的对象和属性

从 ajax 检索时无法识别和显示 HTML 实体

识别 ASP.NET MVC 代码中的 Angular js AJAX 调用

在 IE 的 jQuery Ajax 成功函数中无法识别选择器

Capybara 无法识别 ajax 加载的元素。?