in Architettura Software, Informatica

Ruoli in Microsoft Entra e .NET Core 10 API

Proteggere un’applicazione aziendale è un passaggio fondamentale. Se utilizzi Microsoft Entra ID (ex Azure AD) come Identity Provider e una moderna API .NET Core 10, l’approccio migliore per gestire i permessi è il controllo basato sui ruoli (RBACRole-Based Access Control).

In questo post vediamo passo dopo passo come creare i ruoli in Entra ID e come sfruttarli all’interno di una .NET 10 Web API per proteggere i tuoi endpoint.

1. Creare i Ruoli dell’App in Microsoft Entra ID

A differenza dei ruoli globali di Azure, per un’applicazione specifica si utilizzano i Ruoli dell’App (App Roles).

  1. Accedi al portale di Microsoft Entra.
  2. Vai su Registrazioni app (App registrations) e seleziona la registrazione della tua API (o della tua app).
  3. Nel menu di sinistra, seleziona Ruoli dell’app (App roles).
  4. Clicca su Crea ruolo app e compila i campi principali:
    • Nome visualizzato: Es. Administrator o ProductWriter.
    • Tipi di membri consentiti: Scegli Utenti/Gruppi (o Applicazioni, a seconda delle necessità).
    • Valore: La stringa che arriverà nel token JWT (es. Admin o Writer). Fai attenzione: non inserire spazi nel valore.
    • Descrizione: Una breve nota sul compito di questo ruolo.
  5. Salva le modifiche.

2. Assegnare i Ruoli a Utenti o Gruppi

Ora che il ruolo esiste, devi assegnarlo agli utenti che possono compiere determinate azioni:

  1. Vai su Applicazioni aziendali (Enterprise applications) in Entra ID e seleziona la tua app.
  2. Clicca su Utenti e gruppi (Users and groups) nel menu laterale.
  3. Clicca su Aggiungi utente/gruppo.
  4. Seleziona l’utente o il gruppo di sicurezza desiderato.
  5. Seleziona Seleziona un ruolo e scegli il ruolo creato in precedenza (es. Administrator).
  6. Clicca su Assegna.

Nota: Quando l’utente effettuerà il login, Entra ID inserirà automaticamente questo ruolo dentro il token JWT sotto forma di claim (roles).

3. Configurare l’API .NET Core 10 per leggere i Ruoli

All’interno della tua API .NET 10, sfrutterai il pacchetto Microsoft.Identity.Web per validare i token e mappare correttamente i ruoli.

Nel file Program.cs, configura l’autenticazione JWT indicando a .NET quale claim type mappa i ruoli:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
using Microsoft.IdentityModel.Tokens;

var builder = WebApplication.CreateBuilder(args);

// Configura l'autenticazione con Microsoft.Identity.Web
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));

builder.Services.AddControllers();

var app = builder.Build();

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

app.MapControllers();
app.Run();

Nel file appsettings.json, assicurati che la configurazione di AzureAd punti correttamente alla tua directory e alla tua applicazione:

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "TenantId": "IL_TUO_TENANT_ID",
  "ClientId": "IL_TUO_CLIENT_ID"
}

4. Proteggere gli Endpoint dell’API

Con .NET Core 10, proteggere i controller o le Minimal API in base ai ruoli ricevuti dal token Entra ID è semplicissimo.

Usando i Controller tradizionali:

Basta applicare l’attributo [Authorize] specificando la proprietà Roles:

[Authorize]
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    // Accessibile a qualsiasi utente autenticato
    [HttpGet]
    public IActionResult GetProducts() => Ok(new[] { "Laptop", "Mouse" });

    // Accessibile SOLO agli utenti con ruolo "Admin" in Entra ID
    [HttpPost]
    [Authorize(Roles = "Admin")]
    public IActionResult CreateProduct([FromBody] string productName)
    {
        // Logica di creazione...
        return Created("", productName);
    }
}

Usando le Minimal APIs (.NET 10):

Se preferisci le Minimal APIs, puoi applicare il controllo direttamente sulla rotta usando RequireAuthorization:

app.MapPost("/api/products", (string productName) => {
    return Results.Created($"/api/products/1", productName);
})
.RequireAuthorization(p => p.RequireRole("Admin"));

Vantaggi di questo approccio

  • Stateless: Una volta emesso il token da Entra ID, l’API non deve interrogare il database per verificare i ruoli dell’utente.
  • Centralizzato: Gestisci gli accessi direttamente dal cloud di Microsoft senza toccare il codice dell’applicazione ogni volta che cambia un organigramma.