0Pricing
C# Academy · Lezione

Ordine dei middleware e middleware integrati

Comprenda l'ordine corretto dei middleware per autenticazione, routing, CORS e gestione delle eccezioni.

Ordine dei middleware e middleware integrati è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.

Perché l'ordine è importante

I middleware di ASP.NET Core vengono eseguiti esattamente nell'ordine in cui sono registrati. Un ordine errato causa vulnerabilità di sicurezza, problemi di prestazioni o comportamenti non corretti: ad esempio, il routing deve precedere l'autorizzazione, che a sua volta deve precedere l'esecuzione degli endpoint.

Ordine consigliato dei middleware

Microsoft documenta l'ordine consigliato. Discostarsi da esso crea problemi difficili da diagnosticare. Di seguito è riportato l'ordine canonico per un'API ASP.NET Core in produzione.

// Recommended order:
app.UseExceptionHandler();    // 1. Catch all exceptions
app.UseHsts();                // 2. HTTP Strict Transport Security
app.UseHttpsRedirection();    // 3. Redirect HTTP to HTTPS
app.UseStaticFiles();         // 4. Serve static assets
app.UseRouting();             // 5. Match route patterns
app.UseCors();                // 6. Cross-Origin
app.UseAuthentication();      // 7. Who are you?
app.UseAuthorization();       // 8. Are you allowed?
app.UseRateLimiter();         // 9. Throttle
app.UseOutputCache();         // 10. Cache responses
// Map endpoints here
app.MapControllers();
app.Run();

Gestione delle eccezioni per prima

Il middleware per la gestione delle eccezioni deve essere il primo, nella posizione più esterna, in modo da intercettare le eccezioni generate da tutti i middleware e gli endpoint successivi.

// Development: detailed error page
if (app.Environment.IsDevelopment())
    app.UseDeveloperExceptionPage();
else
{
    // Production: generic error page + structured response
    app.UseExceptionHandler("/error");
    app.UseHsts();
}

// OR: use ProblemDetails globally (recommended .NET 8+)
builder.Services.AddProblemDetails();
app.UseExceptionHandler();
// All unhandled exceptions -> RFC 7807 ProblemDetails JSON

File statici prima del routing

I file statici, tramite UseStaticFiles, dovrebbero essere gestiti prima del routing. La restituzione di un file statico interrompe anticipatamente la pipeline: non è necessario eseguire l'autenticazione o il routing per /css/main.css.

app.UseStaticFiles(); // serves wwwroot/* without going through auth
app.UseRouting();     // expensive: runs route matching

// If you put UseStaticFiles AFTER UseRouting, the route
// matcher runs unnecessarily for every .js/.css request.
// Serve static files first for better performance.

Autenticazione prima dell'autorizzazione

UseAuthentication deve precedere UseAuthorization. L'autenticazione valorizza HttpContext.User; l'autorizzazione verifica l'utente così valorizzato rispetto ai criteri.

// WRONG ORDER — authorization runs before user is populated:
app.UseAuthorization();  // user is null → everything allowed!
app.UseAuthentication(); // too late

// CORRECT:
app.UseAuthentication(); // populates context.User
app.UseAuthorization();  // checks context.User against policies

CORS prima dell'autenticazione

Il middleware CORS deve essere eseguito prima dell'autenticazione, in modo che le richieste preflight OPTIONS vengano gestite senza richiedere gli header di autenticazione.

builder.Services.AddCors(opts =>
    opts.AddPolicy("Frontend", p =>
        p.WithOrigins("https://myapp.com")
         .AllowAnyHeader()
         .AllowAnyMethod()));

app.UseRouting();
app.UseCors("Frontend"); // before auth — handles OPTIONS pre-flight
app.UseAuthentication();
app.UseAuthorization();

Middleware integrati comuni

ASP.NET Core include numerosi componenti middleware integrati. Sapere a cosa serve ciascuno aiuta a capire quando e come utilizzarli.

// Compression: compresses responses (must be before static files)
builder.Services.AddResponseCompression();
app.UseResponseCompression();

// Request localization: sets culture from Accept-Language header
builder.Services.AddLocalization();
app.UseRequestLocalization();

// Health checks: /health endpoint
builder.Services.AddHealthChecks();
app.MapHealthChecks("/health");

// Forwarded headers: trust X-Forwarded-For from reverse proxy
app.UseForwardedHeaders();

Approfondimento sul middleware di routing

UseRouting() associa la richiesta in ingresso a un modello di route e memorizza l'associazione in HttpContext. UseEndpoints() (o MapXxx()) esegue quindi l'endpoint associato.

app.UseRouting(); // matches route, stores in context

// Between UseRouting and Map*: middleware can read route data
app.Use(async (ctx, next) =>
{
    var endpoint = ctx.GetEndpoint();
    var routeName = endpoint?.DisplayName;
    Console.WriteLine($"Matched: {routeName}");
    await next(ctx);
});

// All auth and other middleware go here
app.UseAuthentication();
app.UseAuthorization();

// Execute the matched endpoint
app.MapControllers();
app.MapGet("/", () => "Home");

Posizionamento della compressione delle risposte

La compressione delle risposte deve essere eseguita prima dei file statici e del routing, in modo che l'output compresso venga scritto prima della generazione del contenuto. La posizioni subito dopo la gestione delle eccezioni.

// Correct placement for response compression:
app.UseExceptionHandler();
app.UseResponseCompression(); // before static files
app.UseStaticFiles();          // compressed static files
app.UseRouting();
// ... rest of pipeline

Caso reale: pipeline completa per la produzione

Una pipeline di produzione completa che combina tutte le raccomandazioni in uno stack middleware sicuro e ordinato correttamente.

var app = builder.Build();

if (app.Environment.IsDevelopment())
    app.UseDeveloperExceptionPage();
else { app.UseExceptionHandler(); app.UseHsts(); }

app.UseResponseCompression();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCors("AllowFrontend");
app.UseAuthentication();
app.UseAuthorization();
app.UseRateLimiter();
app.UseOutputCache();

app.MapHealthChecks("/health").AllowAnonymous();
app.MapControllers();

app.Run();

Verifica rapida

Perché UseAuthentication deve precedere UseAuthorization nella pipeline middleware?

Riepilogo: ordine dei middleware e middleware integrati

Punti chiave:

  • Gestione delle eccezioni per prima, file statici prima del routing, autenticazione prima dell'autorizzazione, CORS prima dell'autenticazione
  • La compressione delle risposte va eseguita all'inizio (prima dei file statici) per ottenere il massimo effetto
  • UseRouting + UseAuthorization + Map*: il middleware interposto tra questi elementi può leggere i dati della route
  • Integrati: UseHsts, UseHttpsRedirection, UseStaticFiles, UseRateLimiter, UseOutputCache
  • Verifichi ctx.GetEndpoint() tra UseRouting e MapXxx per leggere le informazioni sulla route associata

Domande Frequenti

La lezione «Ordine dei middleware e middleware integrati» è gratuita?

Sì — il testo completo di «Ordine dei middleware e middleware integrati» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.

Cosa imparerò in «Ordine dei middleware e middleware integrati»?

Comprenda l'ordine corretto dei middleware per autenticazione, routing, CORS e gestione delle eccezioni. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Ordine dei middleware e middleware integrati»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Panoramica della pipeline di ASP.NET Core
  2. Scrittura di middleware personalizzati
  3. Interruzione anticipata e ramificazione
  4. Ordine dei middleware e middleware integrati
← Torna a C# Academy