aspnet core policy

in ASPNET Core, C#

AspNet Core – Autenticazione basata su Claims

Reading Time: 2 minutes

Durante l’accesso ad un applicazione ASPNET distinguiamo le due fasi distinte:

  • autenticazione: in questa fase viene verificato se l’utente esiste effettivamente all’interno del sistema, e quindi può accedere.
  • autorizzazione: una volta effettuata l’autenticazione, per poter accedere ad una risorsa all’utente deve essere associata la relativa autorizzazione.

All’interno di ASPNET Core 3.0 per abilitare il processi di autenticazione e autorizzazione è necessario modificare la classe Startup.cs, ed in particolar modo aggiungere le seguenti linee all’interno del metodo Configure:

app.UseAuthentication();
app.UseAuthorization();

Nelle applicazioni ASPNET MVC l’utilizzo dell’attributo [Autorize] consente di definire l’autorizzazione ad una particolare Action o ad un Controller per un particolare ruolo. In pratica, ogni utente può essere associato uno o più ruoli, che consetono di specificare l’accesso alla risorsa

[Authorize(Roles="Admin, Vendor")]
public class ProductController : Controller
{

Nell’esempio precedente, tutte le action del controller precedente sono accessibili solo per gli utenti con ruolo Admin oppure Vendor. Ovviamente la stessa logica può essere utilizzato anche utilizzando Razor Pages.

In ASPNET.Core 3, il processo di autorizzazione viene gestito sempre attraverso claims. Un claim è una coppia “chiave”/”valore” che contiene i dati associati, ad esempio al profilo dell’utente. La sicurezza dell’applicazione è claim-based, il che signifca che per l’utente corrente tramite [Authorize] vengono eseguite le seguenti verifiche:

  • verifica se l’utente ha uno o più claim associati, per il ruolo utente
  • verifica se l’utente ha almeno uno claim associato a Admin o Vendor

Durante il processo di autenticazione all’interno dell’oggetto ClaimsPrincipal viene popolata la lista contente i claims associati all’utente.

Definire Policy di accesso

All’interno del metodo ConfigureServices della classe Startup.cs, è possibile definire policy di accesso attraverso il metodo:

services.AddAuthorization(....)

che accetta in ingresso una lambda expression, che consente la configurazione delle policies che possono essere utilizzate tramite l’attributo [Authorize]. Utilizzando AddPolicy viene definita la policy, ed il metodo utilizza il primo parametro il nome che dovrà essere impostato e come secondo parametro una lambda expression con il tipo di claim richiesto.

services.AddAuthorization(p =>
{
   p.AddPolicy("PolicyName", polBuilder => polBuilder.RequireClaim(ClaimTypes.Email));
});

Il codice precedente crea una nuova policy denominata PolicyName e basata sulla richiesta della presenza di un claim di tipo email. La policy appenda definita può essere utilizzata all’interno dell’attributo Autorize:

[Authorize(Policy="PolicyName")]
public class CommunicationController : Controller
{

All’interno del metodo AddAuthorization è possibile definire tutte le policy che l’applicazione necessiterà. Spesso si rende necessario verificare non solo la presenza di un claim, ma anche il suo valore.

services.AddAuthorization(p=>
{
   p.AddPolicy("PolicyName", 
         polBuilder => polBuilder.RequireClaim(ClaimTypes.Email));
   p.AddPolicy("PolicyName1", 
         polBuilder => polBuilder.RequireClaim(ClaimTypes.Name, 
                               new string[] { "name1", "name2"} ));
});

Una nota importante riguarda la possibilità di combinare il sistema tradizionale di [Authorize] basato sui ruoli, con quello basato sui claim:

[Authorize(Policy="PolicyName")]
[Authorize(Roles="Admin")]
public class EmailController : Controller
{

Nell’esempio precedente vengono analizzate le autorizzazioni legate alla policy chiamata PolicyName e a quello dei ruoli Admin.