2015-07-27 12 views
6

Ich verschiebe ein Web Api 2 Projekt zu MVC 6, da Microsoft die zwei APIs in ASP.NET 5 zusammenführt. In meinem WebApi-Projekt hatte ich eine benutzerdefinierte Attributfilterklasse, die authentifizieren, autorisieren und verhindern Sie, dass Transaktionen mit einer Kombination aus öffentlichem Schlüssel, privatem Schlüssel und HMAC-Authentifizierung wiederholt werden (im Prinzip doing this mit einigen Optimierungen, die in mein Projekt passen).IAuthenticationFilter Entsprechung in MVC6

Jetzt in MVC6, so weit ich verstehe, muss ich aufhören, etwas im Microsoft.Web.Http Namespace zu verwenden und stattdessen Microsoft.AspNet.Mvc verwenden. Also ich habe das getan, aber die Microsoft.AspNet.Mvc.Filters scheint keine Entsprechung von Web Api 2 IAuthenticationFilter zu haben.

Dies ist ein Problem für mich, weil mein Kunde AuthenticationFilter alle IAuthenticationFilter implementiert hat, mit all der Logik darin. Noch wichtiger ist, dass es den Kontext verwendete, um den öffentlichen Schlüssel des Kontos vorübergehend zu speichern, so dass mein Controller darauf zugreifen konnte, um das Konto der Reihe nach zu laden.

Also meine Frage ist, was ist die richtige Methode zum Filtern von Anfragen in MVC6, mit einer Authentifizierung Filter-ähnliche Klasse, um die Anfragen abzufangen und die entsprechenden Statuscodes zurückgeben? Ich kann keinen Artikel finden, der speziell auf diese Details eingeht (sie alle decken MVC5 ab).

Antwort

4

Ich weiß, dass es eine ältere Frage ist, aber hoffentlich findet jemand (vielleicht sogar Sie selbst) einen Wert in der Antwort.

MVC6 hat tatsächlich eine Alternative. Sie haben eine

public abstract class AuthorizationFilterAttribute : 
    Attribute, IAsyncAuthorizationFilter, IAuthorizationFilter, IOrderedFilter 

, die Sie im Grunde sagt, dass Sie Ihre eigene Klasse erstellen können, leiten sich aus diesem (Namespace all dieser Schnittstellen, btw, Microsoft.AspNet.Mvc.Filters ist und dass es sein sollte. Sie können entweder schmücken die Aktion mit ihm, oder Sie können dies in Startup.cs, tun, um alle Aktionen anwenden:

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add MVC services to the services container. 
     services.AddMvc(options => 
     { 
      // add an instance of the filter, like we used to do it 
      options.Filters.Add(new MySpecialFilter()); 
     }); 

     services.AddTransient<LogFilter>(); 
    } 

Wenn Sie ein bisschen mehr Logik in dem Filter verwendet werden soll (zB meine LogFilter oben), die instanziiert über DI müssen Sie entweder Service Filters or Type Filters.

verwenden

Sie können die Aktionen nun mit [ServiceFilter(typeof(LogFilter))] dekorieren oder o.Filters.Add(new ServiceFilterAttribute(typeof(LogFilter))); in der Datei Startup.cs verwenden. Aber denken Sie daran, um dies zu tun, müssen Sie registrieren den Typ mit dem DI-Container, wie ich oben mit dem .AddTransient<>() Aufruf.

1

IAuthenticationFilter ist nicht mehr und IAuthorizationFilter nicht einfach ersetzen Sie es in MVC 6

Grund: Authentifizierung Autorisierung nicht gleich.

Daher IMO der Authentifizierungsfilter sollte verfügbar bleiben!