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 (RBAC – Role-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).
- Accedi al portale di Microsoft Entra.
- Vai su Registrazioni app (App registrations) e seleziona la registrazione della tua API (o della tua app).
- Nel menu di sinistra, seleziona Ruoli dell’app (App roles).
- 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.
AdminoWriter). Fai attenzione: non inserire spazi nel valore. - Descrizione: Una breve nota sul compito di questo ruolo.
- 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:
- Vai su Applicazioni aziendali (Enterprise applications) in Entra ID e seleziona la tua app.
- Clicca su Utenti e gruppi (Users and groups) nel menu laterale.
- Clicca su Aggiungi utente/gruppo.
- Seleziona l’utente o il gruppo di sicurezza desiderato.
- Seleziona Seleziona un ruolo e scegli il ruolo creato in precedenza (es. Administrator).
- 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.