In uno script precedente, abbiamo visto come sfruttare Ninject in un'applicazione ASP.NET MVC in modo da iniettare automaticamente le dipendenze all'interno dei controller.
Una simile necessità può verificarsi anche con un action filter. Per esempio, un authorization filter potrebbe aver bisogno di IUserService per accedere ai dati degli utenti e verificare se l'utente ha accesso alla funzionalità richiesta, oppure potrebbe accettare nel costruttore un array di IUserAuthorizationPolicy, da valutare in sequenza:
public class MyCustomAuthorization : IAuthorizationFilter { private IUserAuthorizePolicy[] _policies; public MyCustomAuthorization(IUserAuthorizePolicy[] policies) { _policies = policies; } public void OnAuthorization(AuthorizationContext filterContext) { if (_policies.Any(x => !x.Authorize(filterContext))) { throw new UnauthorizedAccessException(); } } }
Nell'esempio in alto, sul metodo OnAuthorization, valutiamo il risultato delle policy (metodo Authorize) registrate e, se una di queste fallisce, neghiamo l'accesso alla risorsa.
Come possiamo notare, MyCustomAuthorization sfrutta la constructor injection per accedere all'elenco delle policy. In questo modo, però, non possiamo utilizzare direttamente questo filtro, indicandolo come attributo; dobbiamo realizzare invece una seconda classe che erediti da Attribute e che, sebbene priva di logica, utilizzeremo per marcare le action e i controller per i quali vogliamo applicare le nostre regole di autorizzazione.
public class MyAuthorizationAttribute : Attribute { }
A questo punto, possiamo finalmente configurare Ninject. Se abbiamo sfruttato il package Ninject.Mvc3, questa operazione può essere effettuata nel metodo RegisterServices di NinjectWebCommon:
using Ninject.Web.Mvc.FilterBindingSyntax; private static void RegisterServices(IKernel kernel) { // .. altri binding ... kernel.BindFilter<MyCustomAuthorization>(FilterScope.Action, null) .WhenActionMethodHas<MyAuthorizationAttribute>(); kernel.BindFilter<MyCustomAuthorization>(FilterScope.Controller, null) .WhenActionMethodHas<MyAuthorizationAttribute>(); }
Il metodo BindFilter è disponibile se importiamo il namespace Ninject.Web.Mvc.FilterBindingSyntax e ci permette di associare ed eseguire il filtro MyCustomAuthorization alla presenza dell'attribute MyAuthorizationAttribute, sia a livello di action che di controller. Se invece vogliamo registrare il filtro a livello globale, possiamo omettere la condizione di when:
private static void RegisterServices(IKernel kernel) { // .. altri binding ... kernel.BindFilter<MyCustomAuthorization>(FilterScope.Global, null) }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare Azure AI Studio per testare i modelli AI
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Ottimizzare le performance usando Span<T> e il metodo Split
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Ricevere notifiche sui test con Azure Load Testing
Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
Combinare Container Queries e Media Queries
Il nuovo controllo Range di Blazor 9
Filtrare i dati di una QuickGrid in Blazor con una drop down list
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Generare la software bill of material (SBOM) in GitHub
Gestione degli stili CSS con le regole @layer
I più letti di oggi
- Eseguire query in contemporanea con EF
- Fissare una versione dell'agent nelle pipeline di Azure DevOps
- .NET Aspire per applicazioni distribuite
- Utilizzare Locust con Azure Load Testing
- Autenticazione di git tramite Microsoft Entra ID in Azure DevOps
- Repaint, Reflow e Compositing: Come Funziona il Rendering nel Browser
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!