Html.AntiForgeryToken() 仍然需要吗?

Posted

技术标签:

【中文标题】Html.AntiForgeryToken() 仍然需要吗?【英文标题】:Html.AntiForgeryToken() still required? 【发布时间】:2015-09-06 17:24:25 【问题描述】:

在 ASP.NET .NET4.6 vNext 中是否仍需要 @html.AntiForgeryToken()

表单装饰已更改为

<form asp-controller="Account" 
      asp-action="Login" 
      asp-route-returnurl="@ViewBag.ReturnUrl" 
      method="post" 
      class="form-horizontal" 
      role="form">

从这里

@using (Html.BeginForm("Login", 
                       "Account", 
                       new  ReturnUrl = ViewBag.ReturnUrl , 
                       FormMethod.Post, 
                       new  @class = "", role = "form" ))

并且不再包含这个

@Html.AntiForgeryToken()

控制器动作仍然像预期的那样标有ValidateAntiForgeryToken 属性,那么它到底来自哪里?自动?

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)

【问题讨论】:

【参考方案1】:

表单标签助手会自动添加防伪令牌。 (除非您将其用作标准 html 表单元素,否则手动添加 action 属性)。查看form tag helper的源码,你会在Process方法的最后看到如下内容。

if (Antiforgery ?? antiforgeryDefault)

    var antiforgeryTag = Generator.GenerateAntiforgery(ViewContext);
    if (antiforgeryTag != null)
    
        output.PostContent.AppendHtml(antiforgeryTag);
    

如果你检查登录页面的html,你会在表单中看到如下隐藏的输入:

<input name="__RequestVerificationToken" type="hidden" value="CfDJ8BIeHClDdT9...">

您也可以通过添加asp-antiforgery 属性手动启用/禁用它:

<form asp-controller="Account" asp-action="Register" asp-antiforgery="false" method="post" class="form-horizontal" role="form">

【讨论】:

从 MVC 6、Asp.net 5 RC1 开始,Tag Helper 是“asp-antiforgery”而不是“asp-anti-forgery”,不确定它是否已经如此或已更改。 &lt;form asp-controller="Account" asp-action="Register" asp-antiforgery="false" method="post" class="form-horizontal" role="form"&gt;

以上是关于Html.AntiForgeryToken() 仍然需要吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用删除链接删除对象时如何包含 @Html.AntiForgeryToken()

[转]MVC Html.AntiForgeryToken() 防止CSRF攻击

如何通过 AngularJs 发送 AntiForgeryToken?

Html.AntiForgeryToken() 升级到 .NET 3.5 SP1 后导致错误

ajax中加上AntiForgeryToken防止CSRF攻击

使用 jQuery Ajax 和 Html.AntiForgeryToken() 时,防伪表单字段“__RequestVerificationToken”不存在