在ajax请求中添加@ Html.AntiForgeryToken()

时间:2014-02-09 14:09:18

标签: c# ajax asp.net-mvc

大量搜索跨站点伪造并将其添加到ajax请求中。所以这就是我所做的。

控制器

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Delete(int id = 0)
    {
        // Do something here

        if (Request.IsAjaxRequest())
            return new HttpStatusCodeResult(HttpStatusCode.OK);

        return RedirectToAction("Index");
    }

JS

$(function () {
    $(".delete").click(function () {
        var bool = confirm("Are you sure?");
        var $link = $(this);

        if (!bool) return false;

        var token = $('input[name="__RequestVerificationToken"]').val();
        var data = {};
        data['__RequestVerificationToken'] = token;

        $.post($(this).attr("href"), data)
        .done(function () {
            $link.closest("tr").fadeOut();
        });

        return false;
    });
});

查看

@Html.AntiForgeryToken()
@Html.ActionLink("Delete", "Delete", new { id = model.Id }, new { @class = "delete" })

虽然有效,但我的问题是......

  1. 我做得对吗?
  2. 在表单中包含@Html.AntiForgeryToken()会自动发布吗?
  3. 如果我在一个页面中有这么多的ajax请求怎么办?我是否必须只包含一个@Html.AntiForgeryToken()
  4. 如果你的方法比较简单,请发帖或这是最简单的方法吗?

1 个答案:

答案 0 :(得分:2)

问:我做得对吗?

答:是的,这就是你应该这样做的方式。

问:在表单中包含@ Html.AntiForgeryToken()是否会自动发布?

答:是的,因为它是输入类型,因此在提交表单时它包含在表单集合中。

问:如果我在一个页面中有这么多的ajax请求怎么办?我是否必须只包含一个@ Html.AntiForgeryToken()?

答:只需要为整个页面使用一个令牌就足够了。

问:如果你有更简单的方法,请发布或这是最简单的方法

答:这是最简单的方法,你应该尝试通过从DOM获取令牌并将其设置为可重用的数据集合(通过将其移动到单独的函数)来连接代码。