我一直在看一下在SO上如何做到这一点的例子,据我所知,迄今为止我已经尝试了所有可以找到的例子,没有成功.我已经尝试将一些实现改为我的场景,但是迄今为止还是失败了.
我在我的页面上有这个_layout.cshtml,所以我总是有一个令牌可用:
<form id="__AjaxAntiForgeryForm" action="#" method="post"> @Html.AntiForgeryToken()</form>
AddAntiForgeryToken = function (data) { data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val(); return data; };
这都是按预期工作,我得到一个反伪造的令牌.我的实际贴子是:
myPage.saveData = function() { var saveUrl = '/exercises/PostData'; var myData = JSON.stringify(myPage.contextsArrays); $.ajax({ type: 'POST',async: false,url: saveUrl,data: AddAntiForgeryToken({ myResults: myData }),success: function () { alert('saved'); },dataType: 'json',contentType: "application/json; charset=utf-8" }); };
我的动作方法如下所示:
[HttpPost,ValidateAntiForgeryToken,JsonExceptionFilter] public JsonResult PostData(List<ResultsDc> myResults) { return Json(_apiClient.SubmitResults(myResults)); }
我一直在尝试使用我一直在尝试的各种实现方式,并且响应始终如一:
{"errorMessage":"The required anti-forgery form field \"__RequestVerificationToken\" is not present."}
我不会发布一个表单,它只是一个数据数组,但检查实际发布的数据Json看起来不正确(它全部编码),但__RequestVerificationToken参数名称在那里,并且令牌值也存在.
我现在很困惑所有这一切,找不到正确的方式发送令牌,以便我的MVC动作被调用.如果我删除ValidateAntiForgeryToken属性并具有JSON.stringify(myPage.contextsArrays);作为数据json看起来正确(未编码),它映射正确.
如何在没有表单的情况下正确地贴出该标记?