Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Html.AntiForgeryToken() still required?

Is @Html.AntiForgeryToken() still required in ASP.NET .NET4.6 vNext?

The form decorations have changed to

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

From this

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

And no longer include this

@Html.AntiForgeryToken() 

The Controller Actions are still marked with the ValidateAntiForgeryToken attribute as expected though so where exactly is it coming from? Automagically?

[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) 
like image 441
matt. Avatar asked Jun 20 '15 23:06

matt.


People also ask

Do I need AntiForgeryToken?

The attacker would be able to login anyway using the userand password that he got. This answer is dangerously wrong. The tokens ARE necessary.

Why we use HTML AntiForgeryToken ()?

This is to prevent Cross-site request forgery in your MVC application. This is part of the OWASP Top 10 and it is vital in terms of web security. Using the @Html. AntiforgeryToken() method will generate a token per every request so then no one can forge a form post.

Is ValidateAntiForgeryToken required?

The ValidateAntiForgeryToken attribute requires a token for requests to the action methods it marks, including HTTP GET requests.


1 Answers

The form tag helper will automatically add the anti forgery token. (Unless you use it as a standard html form element, manually adding an action attribute). Check the source code of the form tag helper, you will see the following at the end of the Process method.

if (Antiforgery ?? antiforgeryDefault) {     var antiforgeryTag = Generator.GenerateAntiforgery(ViewContext);     if (antiforgeryTag != null)     {         output.PostContent.AppendHtml(antiforgeryTag);     } } 

If you check the html of the login page, you will see the following hidden input inside the form:

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

You can also manually enable/disable it adding the asp-antiforgery attribute:

<form asp-controller="Account" asp-action="Register" asp-antiforgery="false" method="post" class="form-horizontal" role="form"> 
like image 143
Daniel J.G. Avatar answered Sep 21 '22 06:09

Daniel J.G.