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

时间:2017-01-03 23:19:31

标签: asp.net-mvc asp.net-core asp.net-core-mvc antiforgerytoken coreclr

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

现在我想在控制器级别使用ValidateAntiForgeryToken,以便它可以处理POSTGET方法。

以下是样本控制器

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

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

    [HttpPost]
    public IActionResult Save(MyModel model)
    {

    }

}

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

2 个答案:

答案 0 :(得分:7)

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

反伪造助手的限制

  

它仅适用于POST请求,而不适用于GET请求。可以说这不是限制,因为在正常的HTTP约定下,除了只读操作之外,你不应该使用GET请求。

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

ASP.NET核心

控制器上的

[ValidateAntiforgeryToken]有局限性。

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

  

ASP.NET Core不支持自动向GET请求添加防伪令牌。

使用[AutoValidateAntiforgeryToken]

改进了控制器级支持
  

此属性与ValidateAntiForgeryToken属性的工作方式相同,不同之处在于它不需要使用以下HTTP方法发出的请求的标记:

     
      
  • GET
  •   
  • HEAD
  •   
  • OPTIONS
  •   
  • TRACE
  •   

答案 1 :(得分:0)

您需要在视图中包含防伪标记。

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

这样,当您发布帖子时,防伪标记随后会与请求一起提交。