小编典典

在ASP.NET MVC中的Ajax中包含antiforgerytoken

ajax

我在使用Ajax的AntiForgeryToken时遇到麻烦。我正在使用ASP.NET
MVC3。我在jQueryAjax调用和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.当我放回属性时,消息仍然弹出。

有任何想法吗?

编辑

antiforgerytoken是在表单内部生成的,但是我没有使用Submit动作来提交它。相反,我只是使用jquery获取令牌的值,然后尝试用ajax发布该值。

这是包含令牌的表单,位于顶部母版页上:

<form id="__AjaxAntiForgeryForm" action="#" method="post">
    @Html.AntiForgeryToken()
</form>

阅读 370

收藏
2020-07-26

共1个答案

小编典典

您错误地指定contentTypeapplication/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>
2020-07-26