C# Academy · Lektion

Middleware-ordning och inbyggd middleware

Förstå korrekt middleware-ordning för autentisering, routing, CORS och felhantering.

Lektion 4 av 412 steg

Middleware-ordning och inbyggd middleware är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 4 lektioner.

Varför ordningen är viktig

ASP.NET Core-middleware körs exakt i den ordning som den registreras. Fel ordning kan orsaka säkerhetsluckor, prestandaproblem eller felaktigt beteende — routing måste till exempel komma före auktorisering, som i sin tur måste komma före körning av endpoints.

Rekommenderad ordning för middleware

Microsoft dokumenterar den rekommenderade ordningen. Om du avviker från den uppstår problem som är svåra att felsöka. Här är den kanoniska ordningen för ett ASP.NET Core-API i produktion.

// 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();

Felhantering först

Middleware för felhantering måste ligga först, längst ut, så att den fångar undantag från all efterföljande middleware och alla endpoints.

// 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

Statiska filer före routing

Statiska filer (UseStaticFiles) bör komma före routing. När en statisk fil levereras kortsluts pipelinen — det finns ingen anledning att köra autentisering eller routing för /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.

Autentisering före auktorisering

UseAuthentication måste komma före UseAuthorization. Autentiseringen fyller i HttpContext.User, och auktoriseringen kontrollerar sedan den ifyllda användaren mot policyerna.

// 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 före autentisering

CORS-middleware måste köras före autentisering så att preflight-OPTIONS-förfrågningar hanteras utan att autentiseringsheaders krävs.

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();

Vanliga inbyggda middlewarekomponenter

ASP.NET Core levereras med många inbyggda middlewarekomponenter. Genom att känna till vad varje komponent gör blir det lättare att förstå när och hur de ska användas.

// 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();

Fördjupning i routing-middleware

UseRouting() matchar den inkommande förfrågan mot ett routningsmönster och lagrar matchningen i HttpContext. UseEndpoints() (eller MapXxx()) kör sedan den matchade slutpunkten.

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");

Svarskomprimeringens placering

Svarskomprimering måste placeras före statiska filer och routing så att komprimerad utdata skrivs innan innehållet genereras. Placera den direkt efter felhanteringen.

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

I praktiken: fullständig produktionspipeline

En komplett produktionspipeline som kombinerar alla rekommendationer till en välordnad och säker middleware-stack.

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();

Snabb kontroll

Varför måste UseAuthentication komma före UseAuthorization i middleware-pipelinen?

Sammanfattning: middlewareordning och inbyggd middleware

Viktigaste punkterna:

  • Felhantering först, statiska filer före routing, autentisering före auktorisering, CORS före autentisering
  • Svarskomprimering placeras tidigt (före statiska filer) för maximal effekt
  • UseRouting + UseAuthorization + Map* — middleware mellan dem kan läsa routningsdata
  • Inbyggda komponenter: UseHsts, UseHttpsRedirection, UseStaticFiles, UseRateLimiter, UseOutputCache
  • Kontrollera ctx.GetEndpoint() mellan UseRouting och MapXxx för att läsa information om den matchade routen
Gratis att börja

Lär dig C# med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
93
Lektioner
346

Vanliga frågor

Är lektionen ”Middleware-ordning och inbyggd middleware” gratis?

Ja – hela texten till ”Middleware-ordning och inbyggd middleware” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Middleware-ordning och inbyggd middleware”?

Förstå korrekt middleware-ordning för autentisering, routing, CORS och felhantering. Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C# Academy?

Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Middleware-ordning och inbyggd middleware”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C# Academy-lektionen?

Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Översikt över ASP.NET Core-pipelinen
  2. Skriva anpassad middleware
  3. Kortslutning och förgrening
  4. Middleware-ordning och inbyggd middleware
← Tillbaka till C# Academy