我在使用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>

10-08 18:47