Reihenfolge und integrierte Middleware
Verstehen Sie die korrekte Reihenfolge von Middleware für Authentifizierung, Routing, CORS und Ausnahmebehandlung.
Reihenfolge und integrierte Middleware ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum die Reihenfolge wichtig ist
ASP.NET-Core-Middleware wird genau in der Reihenfolge ausgeführt, in der sie registriert wurde. Eine falsche Reihenfolge führt zu Sicherheitslücken, Leistungseinbußen oder fehlerhaftem Verhalten. Beispielsweise muss das Routing vor der Autorisierung ausgeführt werden, die wiederum vor der Endpunktausführung erfolgen muss.
Die empfohlene Middleware-Reihenfolge
Microsoft dokumentiert die empfohlene Reihenfolge. Abweichungen davon führen zu schwer zu diagnostizierenden Problemen. Hier ist die kanonische Reihenfolge für eine ASP.NET-Core-API im Produktiveinsatz.
// 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();Ausnahmebehandlung zuerst
Die Middleware zur Ausnahmebehandlung muss zuerst, also äußersten, registriert werden, damit sie Ausnahmen aller nachfolgenden Middleware-Komponenten und Endpunkte abfängt.
// 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 JSONStatische Dateien vor dem Routing
Statische Dateien (UseStaticFiles) sollten vor dem Routing verarbeitet werden. Das Ausliefern einer statischen Datei beendet die Pipeline vorzeitig; für /css/main.css müssen weder Authentifizierung noch Routing ausgeführt werden.
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.Authentifizierung vor Autorisierung
UseAuthentication muss vor UseAuthorization ausgeführt werden. Die Authentifizierung befüllt HttpContext.User; die Autorisierung prüft diesen befüllten Benutzer anhand von Richtlinien.
// 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 policiesCORS vor der Authentifizierung
Die CORS-Middleware muss vor der Authentifizierung ausgeführt werden, damit Preflight-Anfragen mit OPTIONS ohne erforderliche Authentifizierungs-Header verarbeitet werden.
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();Häufig verwendete integrierte Middleware
ASP.NET Core bietet zahlreiche integrierte Middleware-Komponenten. Wenn Sie wissen, welche Aufgabe die einzelnen Komponenten erfüllen, können Sie besser verstehen, wann und wie Sie sie einsetzen.
// 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();Routing-Middleware im Detail
UseRouting() ordnet die eingehende Anfrage einem Routenmuster zu und speichert die Zuordnung in HttpContext. Anschließend führt UseEndpoints() (oder MapXxx()) den zugeordneten Endpunkt aus.
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");Platzierung der Antwortkomprimierung
Die Antwortkomprimierung muss vor statischen Dateien und dem Routing erfolgen, damit die komprimierte Ausgabe geschrieben wird, bevor Inhalte erzeugt werden. Platzieren Sie sie unmittelbar nach der Ausnahmebehandlung.
// Correct placement for response compression:
app.UseExceptionHandler();
app.UseResponseCompression(); // before static files
app.UseStaticFiles(); // compressed static files
app.UseRouting();
// ... rest of pipelinePraxisbeispiel: Vollständige Produktionspipeline
Eine vollständige Produktionspipeline, die alle Empfehlungen zu einem gut geordneten, sicheren Middleware-Stack kombiniert.
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();Kurztest
Warum muss UseAuthentication in der Middleware-Pipeline vor UseAuthorization ausgeführt werden?
Zusammenfassung: Middleware-Reihenfolge und integrierte Middleware
Wichtigste Erkenntnisse:
- Ausnahmebehandlung zuerst, statische Dateien vor dem Routing, Authentifizierung vor Autorisierung, CORS vor der Authentifizierung
- Die Antwortkomprimierung wird früh ausgeführt (vor statischen Dateien), um eine maximale Wirkung zu erzielen
- UseRouting + UseAuthorization + Map* — Middleware zwischen diesen Komponenten kann Routendaten lesen
- Integriert: UseHsts, UseHttpsRedirection, UseStaticFiles, UseRateLimiter, UseOutputCache
- Überprüfen Sie
ctx.GetEndpoint()zwischen UseRouting und MapXxx, um Informationen zur zugeordneten Route zu lesen
Häufig gestellte Fragen
Ist die Lektion „Reihenfolge und integrierte Middleware“ kostenlos?
Ja — der vollständige Text von „Reihenfolge und integrierte Middleware“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Reihenfolge und integrierte Middleware“?
Verstehen Sie die korrekte Reihenfolge von Middleware für Authentifizierung, Routing, CORS und Ausnahmebehandlung. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Reihenfolge und integrierte Middleware“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Überblick über die ASP.NET-Core-Pipeline
- Benutzerdefinierte Middleware schreiben
- Kurzschließen und Verzweigen
- Reihenfolge und integrierte Middleware