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

4
我有一个ASP.NET Core应用程序。到目前为止,我一直在所有POST操作方法上使用ValidateAntiForgeryToken属性。
现在我正在考虑在控制器级别使用ValidateAntiForgeryToken,以便它可以同时处理POSTGET方法。
以下是示例控制器:
[ValidateAntiForgeryToken]
public class SearchController : Controller
{
    public SearchController()
    {
    }

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

    [HttpPost]
    public IActionResult Save(MyModel model)
    {

    }

当用户访问URLhttp://localhost/search时,我不确定Index操作方法将如何接收防伪令牌。目前,我收到了Bad Request错误,因为请求中没有包含令牌。
2个回答

13

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

防伪助手的限制

它仅适用于POST请求,而不是GET请求。可以说这并不是一个限制,因为根据正常的HTTP约定,您不应该使用GET请求进行除只读操作以外的任何操作。

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

ASP.NET Core

控制器上的[ValidateAntiforgeryToken]有其限制。

https://learn.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
我认为它仍然很有用。当您在控制器级别添加它时,您不需要将其添加到所有的 post 操作中(代码行数更少),也不会忘记在某些 post 操作中加入它的风险。 - Robert Vuković

0

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

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

这样,当您发布文章时,反伪造令牌将随请求一起提交。


我的问题与POST无关,而是关于GET。 - LP13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接