2017-08-28 1 views

Antwort

1

scheint, was Sie brauchen, ist eine benutzerdefinierte Filterklasse zu schaffen, die für alle IAuthorizationFilterPOST Methoden implementiert, indem Sie HttpContext.Request.HttpMethod Anfrage:

public class ValidateAntiForgeryTokenEveryPost : IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext context) 
    { 
     if (context.HttpContext.Request.HttpMethod == "POST") 
     { 
      System.Web.Helpers.AntiForgery.Validate(); 
     } 
    } 
} 

Dann fügen Sie den neuen Filter in FilterConfig Klasse:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new ValidateAntiForgeryTokenEveryPost()); 
    } 
} 

Stellen Sie auch sicher, dass der benutzerdefinierte Filter registriert hat in Global.asax Code:

protected void Application_Start() 
{ 
    // other settings 

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

    // other settings 
} 

Durch die Verwendung von globalen Filtern oben angegebenen alle POST-Methode Anforderungen für AntiForgeryToken automatisch überprüft werden, sind unabhängig davon, ob @Html.AntiForgeryToken() nicht vorhanden Innenansicht Seiten.

Nachtrag 1:

Es ist möglich, bestimmte Aktionen von CSRF-Token Prüfung auszuschließen, was Sie daran hindert Validate Verfahren müssen auszuführen, während ein benutzerdefiniertes Attribut Klasse vorhanden ist. Erstellen Sie zunächst eine benutzerdefinierte Attributklasse für Validierungsprüfung:

[AttributeUsage(AttributeTargets.Method)] 
public class ExcludeAntiForgeryCheckAttribute : Attribute 
{ 
    // other stuff 
} 

Danach ActionDescriptor.GetCustomAttributes verwenden, um benutzerdefinierte zu bekommen Attributtyp erstellt oben:

public class ValidateAntiForgeryTokenEveryPost : IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext context) 
    { 
     // adapted from Darin Dimitrov (/a/34588606/) 
     bool isValidate = !context.ActionDescriptor.GetCustomAttributes(typeof(ExcludeAntiForgeryCheckAttribute), true).Any(); 

     // use AND operator (&&) if you want to exclude POST requests marked with custom attribute 
     // otherwise, use OR operator (||) 
     if (context.HttpContext.Request.HttpMethod == "POST" && isValidate) 
     { 
      System.Web.Helpers.AntiForgery.Validate(); 
     } 
    } 
} 

Dann können Sie alle Methoden dekorieren, die von CSRF Validierung ausgenommen werden sollten token:

[HttpPost] 
[ExcludeAntiForgeryCheck] 
public ActionResult Index(ViewModel model) 
{ 
    // other stuff 

    return View(model); 
} 

Referenzen:

Check CRSF token by default in ASP.NET MVC (Standardversion)

Securing all forms using AntiForgeryToken (Attribut-basierte Version)

+0

Vielen Dank. Noch eine Frage. Ich bin neu in MVC, also bin ich nicht sicher, unter welchem ​​Ordner ich benutzerdefinierte Filterklasse erstellen muss. Können Sie mir bitte einen Vorschlag machen? –

+0

Ich denke, Ihre benutzerdefinierte Filterklasse kann im 'App_Start' -Verzeichnis oder einem beliebigen Verzeichnis erstellt werden, vorausgesetzt, dass der Root-Namespace des Projekts anstelle von' ProjectName.App_Start' oder 'ProjectName.FolderName' verwendet wird. –

+0

Vielen Dank .. @Tetsuya Yamamoto –

1

Ich glaube nicht. Für jede Anfrage müssen wir Token überprüfen. Bitte versuchen Sie den folgenden Code in der View-Datei zu verwenden.

@ Html.AntiForgeryToken()

+0

Wir können in jeder Ansicht Seite implementieren. Aber ich möchte dasselbe in der Global.asax-Datei implementieren. –