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”,不确定它是否已经如此或已更改。<form asp-controller="Account" asp-action="Register" asp-antiforgery="false" method="post" class="form-horizontal" role="form">
以上是关于Html.AntiForgeryToken() 仍然需要吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用删除链接删除对象时如何包含 @Html.AntiForgeryToken()
[转]MVC Html.AntiForgeryToken() 防止CSRF攻击
如何通过 AngularJs 发送 AntiForgeryToken?
Html.AntiForgeryToken() 升级到 .NET 3.5 SP1 后导致错误
ajax中加上AntiForgeryToken防止CSRF攻击
使用 jQuery Ajax 和 Html.AntiForgeryToken() 时,防伪表单字段“__RequestVerificationToken”不存在