我在使用Ajax的AntiForgeryToken时遇到麻烦。我正在使用ASP.NET MVC3。我在jQuery Ajax calls and the Html.AntiForgeryToken()中尝试了该解决方案。使用该解决方案, token 现在可以通过:
var data = { ... } // with token, key is '__RequestVerificationToken'
$.ajax({
type: "POST",
data: data,
datatype: "json",
traditional: true,
contentType: "application/json; charset=utf-8",
url: myURL,
success: function (response) {
...
},
error: function (response) {
...
}
});
当我删除
[ValidateAntiForgeryToken]
属性只是为了查看数据(带有 token )是否作为参数传递给 Controller 时,我可以看到它们正在传递。但是由于某种原因,当我放回属性时,仍然会弹出A required anti-forgery token was not supplied or was invalid.
消息。有任何想法吗?
编辑
antiforgerytoken是在表单内部生成的,但是我没有使用Submit Action 来提交它。相反,我只是使用jquery获取 token 的值,然后尝试用ajax发布该值。
这是包含 token 的表单,位于顶部主页上:
<form id="__AjaxAntiForgeryForm" action="#" method="post">
@Html.AntiForgeryToken()
</form>
最佳答案
您已将contentType
错误地指定为application/json
。
这是一个可能如何工作的示例。
Controller :
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(string someValue)
{
return Json(new { someValue = someValue });
}
}
View :
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" }))
{
@Html.AntiForgeryToken()
}
<div id="myDiv" data-url="@Url.Action("Index", "Home")">
Click me to send an AJAX request to a controller action
decorated with the [ValidateAntiForgeryToken] attribute
</div>
<script type="text/javascript">
$('#myDiv').submit(function () {
var form = $('#__AjaxAntiForgeryForm');
var token = $('input[name="__RequestVerificationToken"]', form).val();
$.ajax({
url: $(this).data('url'),
type: 'POST',
data: {
__RequestVerificationToken: token,
someValue: 'some value'
},
success: function (result) {
alert(result.someValue);
}
});
return false;
});
</script>