2017-10-19 1 views
1

Um Cross-Site-Request-Forgery zu verhindern, müssen Sie jedem Formular ein Anti-Fälschungs-Token hinzufügen.Automatisches Hinzufügen von Anti-Fälschungs-Token in ASP.NET MVC mit Razor

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
} 

Ich möchte vermeiden, @Html.AntiForgeryToken zu allen Formularen hinzuzufügen. Gibt es eine Möglichkeit, diesen Prozess zu automatisieren?

Die deutsche Wikipedia article (Image) besagt, dass ein verstecktes Feld mit dem Token automatisch nach @Html.BeginForm hinzugefügt wird, aber es sieht so aus, als ob das nicht korrekt ist.

Antwort

0

Gefunden eine (nicht optimale) Lösung here.

Er verwendet eine andere Erweiterungsmethode, um das Anti-Fälschungs-Token hinzuzufügen. Dies hat den Nachteil, dass Sie für alle vorhandenen HtmlHelper-Erweiterungen neue Methoden benötigen und der Code möglicherweise inkonsistent wird.

public static class FormExtensions 
{ 
    public static MvcForm BeginDataForm(this HtmlHelper html, string action, string controller) 
    { 
     var form = html.BeginForm(action, controller); 

     html.ViewContext.Writer.Write(html.AntiForgeryToken().ToHtmlString()); 

     return form; 
    } 
} 

Auf der Serverseite fand er eine elegante Lösung, um das Token zu validieren. Er fügte einen neuen AuthorizationFilter hinzu und validiert das Token für jede Post-Methode.

public class GlobalAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public sub OnAuthorization(filterContext As AuthorizationContext) 
    { 
     if (filterContext.HttpContext.Request.HttpMethod.ToUpper() == "POST") 
     { 
      AntiForgery.Validate(); 
     } 
    } 
}