在Ajax调用中无法识别AntiforgeryToken

时间:2016-03-30 12:54:26

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

我有一个场景,我不需要通过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 Screen抓取

enter image description here

此外,我的动作方法用ValidateAntiForgeryToken

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

造成这种情况的原因是什么?任何想法?

编辑: 这是一个MVC5项目。

2 个答案:

答案 0 :(得分:1)

找到解决方案。

罪魁祸首是

data: JSON.stringify(data),

将上述内容更改为

data: data,

现在Firebug显示

enter image description here

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

谢谢大家的支持。

答案 1 :(得分:0)

对于我来说,在制定一个有效的解决方案之前,我必须尝试每一篇文章:

<强> 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>