如何在 MVC 的控制器级别使用 ValidateAntiForgeryToken?

How to use ValidateAntiForgeryToken at controller level in MVC?

我有 ASP.NET 核心应用程序。到目前为止,我一直在所有 POST 操作方法上使用 ValidateAntiForgeryToken 属性。

现在我正在考虑在控制器级别使用ValidateAntiForgeryToken,这样它就可以兼顾POSTGET 方法。

下面是示例控制器

[ValidateAntiForgeryToken]
public class SearchController : Controller
{
    public SearchController()
    {
    }

    [HttpGet]
    public IActionResult Index()
    {           
        return View();
    }      

    [HttpPost]
    public IActionResult Save(MyModel model)
    {

    }

}

当用户访问 URL http://localhost/search 时,我不确定 Index 操作方法将如何接收伪造令牌?现在我收到错误 Bad Request 因为请求中没有包含令牌。

您需要在视图中包含防伪令牌。

@using (Html.BeginForm("Save", "Search", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    // Rest of html
}

这样当您执行 post 时,防伪令牌随请求一起提交。

来自http://blog.stevensanderson.com/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

防伪助手的局限性

It only works with POST requests, not GET requests. Arguably this isn’t a limitation, because under the normal HTTP conventions, you shouldn’t be using GET requests for anything other than read-only operations.

所以它在控制器级别没有用。

ASP.NET核心

[ValidateAntiforgeryToken] 控制器有限制。

https://docs.microsoft.com/en-us/aspnet/core/security/anti-request-forgery?view=aspnetcore-2.1

ASP.NET Core doesn't support adding antiforgery tokens to GET requests automatically.

[AutoValidateAntiforgeryToken]

改进了控制器级别的支持

This attribute works identically to the ValidateAntiForgeryToken attribute, except that it doesn't require tokens for requests made using the following HTTP methods:

  • GET
  • HEAD
  • OPTIONS
  • TRACE