我一直在研究如何在SO上执行此操作的示例,据我所知,我已经尝试了所有可以找到的示例,但到目前为止还没有成功。我已尝试将一些实现改为我的场景,但迄今为止也失败了。
我在_layout.cshtml的页面上有这个,所以我总是有一个令牌:
<form id="__AjaxAntiForgeryForm" action="#" method="post"> @Html.AntiForgeryToken()</form>
我的JavaScript utils文件中也有这个方法:
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看起来正确(未编码)并且映射正常。
如何在没有表单的情况下正确发布此令牌?
答案 0 :(得分:32)
Cardboard开发者再次罢工。
我所要做的就是删除:
contentType: "application/json; charset=utf-8"
通过这样做(更改正在发布的帖子请求的类型),获取实际数据属性的Json内容以正确绑定到您的T
模型类型不要 JSON.stringify()
数据。
答案 1 :(得分:14)
(注意:我知道这与已经存在的情况完全不同)
我意识到这已经得到了回答,但是我已经做了很多这样的事情并且会将我的答案添加到堆中。我的网站上没有表格,所以我不得不想办法处理这个问题。关于stackoverflow和一些博客的大量研究最终给了我所需的信息。
首先,我的代码位于我的#34; master&#34;顶部。页面(MVC Razor):
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" }))
{
@Html.AntiForgeryToken()
}
然后,在所有ajax调用(jQuery)中,我这样开始:
var token = $("#__AjaxAntiForgeryForm input").val();
var dataObject = {
__RequestVerificationToken: token,
myData: "whatever"
};
$.ajax({
url: '@Url.Action("action", "controller")',
type: 'POST',
dataType: 'json',
data: dataObject,
error: function (jqXHR, textStatus, errorThrown) {
console.log("ERROR!");
},
success: function (data) {
//whatever
}
});
最后,在控制器方面,这很好用:
public class controllerController : Controller
{
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult action (myModel myData)
{
return Json(new { Success = "true" }, JsonRequestBehavior.DenyGet);
}
}
希望这可以帮助其他人在同一条船上。
答案 2 :(得分:1)
验证是硬编码的,用于查看表单数据。
public AntiForgeryToken GetFormToken(HttpContextBase httpContext)
{
string value = httpContext.Request.Form[_config.FormFieldName];
您可以按照特定格式模拟表单提交。为此,请参阅How to mimic an HTML form submission in a POST request?
如果需要,您也可以制作自己的验证器。 How to POST JSON data to an Asp.Net MVC 2 app with ValidateAntiForgeryToken解释了如何执行此操作。它适用于MVC 2,但您可以从中获取一些想法。