我在使用 ajax 的 AntiForgeryToken 时遇到问题。我正在使用 ASP.NET MVC 3。我在jQuery Ajax 调用和 Html.AntiForgeryToken()中尝试了解决方案。使用该解决方案,现在正在传递令牌:
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]属性只是为了查看数据(带有令牌)是否作为参数传递给控制器时,我可以看到它们正在被传递。但是由于某种原因,A required anti-forgery token was not supplied or was invalid.当我放回属性时仍然会弹出消息。
[ValidateAntiForgeryToken]
A required anti-forgery token was not supplied or was invalid.
有任何想法吗?
编辑
antiforgerytoken 是在表单中生成的,但我没有使用提交操作来提交它。相反,我只是使用 jquery 获取令牌的值,然后尝试 ajax 发布它。
这是包含令牌的表单,位于顶部母版页:
<form id="__AjaxAntiForgeryForm" action="#" method="post"> @Html.AntiForgeryToken() </form>
您错误地指定了contentTypeto application/json。
contentType
application/json
这是一个如何工作的示例。
控制器:
public class HomeController : Controller { public ActionResult Index() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Index(string someValue) { return Json(new { someValue = someValue }); } }
看法:
@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>