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

问题描述 投票:0回答:2

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

现在我想在控制器级别使用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动作方法将如何获得forgerytoken?现在我得到错误Bad Request,因为请求中没有包含令牌。

asp.net-mvc asp.net-core asp.net-core-mvc antiforgerytoken coreclr
2个回答
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方法发出的请求的标记:

  • 得到
  • OPTIONS
  • 跟踪

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.