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 的不同字符串
识别 ASP.NET MVC 代码中的 Angular js AJAX 调用