2015-07-27 9 views
6

Sto spostando un progetto Web Api 2 in MVC 6, poiché Microsoft sta unendo le due API in ASP.NET 5. Nel mio progetto WebApi avevo una classe di filtro Attribute personalizzata che autenticava, autorizzava e prevenire i replay delle transazioni utilizzando una combinazione di chiave pubblica, chiave privata e autenticazione HMAC (in pratica, doing this con alcune modifiche da inserire nel mio progetto).IAuthenticationFilter equivalente in MVC

Ora in MVC6, per quanto ho capito, devo smettere di utilizzare qualsiasi cosa nello spazio dei nomi Microsoft.Web.Http e utilizzare invece Microsoft.AspNet.Mvc. Così ho fatto, ma i Microsoft.AspNet.Mvc.Filters non sembra avere alcun equivalente di Api Web 2 di IAuthenticationFilter.

Questo è un problema per me perché il mio cliente AuthenticationFilter implementato tutti IAuthenticationFilter, con tutta la logica in là. Ancora più importante, stava usando il contesto per memorizzare temporaneamente la chiave pubblica dell'account, così il mio controllore poteva accedervi per caricare l'account a sua volta.

Quindi la mia domanda è, qual è il modo corretto per filtrare le richieste in MVC6, utilizzando una classe simile a Filtro di autenticazione per intercettare le richieste e restituire i codici di stato appropriati? Non riesco a trovare nessun articolo specifico per questi dettagli (tutti tendono a coprire MVC5).

risposta

4

so che è una questione più grande, ma si spera che qualcuno (forse anche voi stessi) potrebbe trovare valore nella risposta.

In realtà, MVC6 ha un'alternativa. Si dispone di un

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

che fondamentalmente ti dice, che è possibile creare la classe personalizzata, derivano da questa (namespace di tutte queste interfacce, btw, è Microsoft.AspNet.Mvc.Filters e che dovrebbe essere esso. È possibile decorare la azione con esso, o si può fare questo in Startup.cs, da applicare a tutti i azioni:

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>(); 
    } 

Se si vuole usare un po 'più logica nel filtro (ad esempio, il mio LogFilter sopra) che viene creata un'istanza tramite DI, è necessario utilizzare Service Filters or Type Filters.

È ora possibile decorare le azioni con [ServiceFilter(typeof(LogFilter))] o utilizzare o.Filters.Add(new ServiceFilterAttribute(typeof(LogFilter))); nel file Startup.cs. Ma tieni presente che per fare ciò è necessario il registrare il tipo con il contenitore DI, come ho fatto sopra con la chiamata .AddTransient<>().

1

IAuthenticationFilter non c'è più e IAuthorizationFilter semplicemente non lo sostituisce in MVC 6

Motivo: l'autenticazione non è uguale ad autorizzazione.

Pertanto, il filtro di autenticazione dovrebbe rimanere disponibile!