ミドルウェアの順序と組み込みミドルウェア
認証、ルーティング、CORS、例外処理における正しいミドルウェアの順序を理解します。
「ミドルウェアの順序と組み込みミドルウェア」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
順序が重要な理由
ASP.NET Coreのミドルウェアは、登録された正確な順序で実行されます。順序を誤ると、セキュリティホール、パフォーマンスの問題、動作不良が発生します。たとえば、ルーティングは認可より前に、認可はエンドポイントの実行より前に配置する必要があります。
推奨されるミドルウェアの順序
Microsoftは推奨される順序を文書化しています。これから外れると、原因の特定が難しい問題が発生します。以下は、本番環境のASP.NET Core APIにおける標準的な順序です。
// 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();例外処理を最初に配置する
例外処理ミドルウェアは、後続するすべてのミドルウェアとエンドポイントからの例外を捕捉できるよう、最初(最外側)に配置する必要があります。
// 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ルーティングより前に静的ファイルを配置する
静的ファイル(UseStaticFiles)はルーティングより前に配置してください。静的ファイルを提供するとパイプラインが途中終了するため、/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.認証を認可より前に配置する
UseAuthenticationはUseAuthorizationより前に配置する必要があります。認証によってHttpContext.Userが設定され、認可は設定されたユーザーをポリシーと照合します。
// 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
プリフライトのOPTIONSリクエストを認証ヘッダーなしで処理できるように、CORSミドルウェアは認証より前に実行する必要があります。
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();よく使われる組み込みミドルウェア
ASP.NET Coreには、多くの組み込みミドルウェアコンポーネントが用意されています。それぞれの役割を知ることで、いつ、どのように使用すればよいかを理解しやすくなります。
// 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();ルーティングミドルウェアの詳細
UseRouting()は受信したリクエストをルートパターンに照合し、その結果をHttpContextに保存します。続いてUseEndpoints()(またはMapXxx())が照合されたエンドポイントを実行します。
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");レスポンス圧縮の配置
圧縮された出力をコンテンツの生成前に書き込めるように、レスポンス圧縮は静的ファイルとルーティングよりも前に配置する必要があります。例外処理の直後に配置してください。
// Correct placement for response compression:
app.UseExceptionHandler();
app.UseResponseCompression(); // before static files
app.UseStaticFiles(); // compressed static files
app.UseRouting();
// ... rest of pipeline実践例:本番環境向けの完全なパイプライン
すべての推奨事項を適切な順序の安全なミドルウェアスタックに組み合わせた、本番環境向けの完全なパイプラインです。
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();理解度チェック
ミドルウェアパイプラインでは、なぜUseAuthenticationをUseAuthorizationより前に配置する必要がありますか?
まとめ:ミドルウェアの順序と組み込みミドルウェア
重要なポイント:
- 例外処理を最初に配置し、静的ファイルをルーティングより前に、認証を認可より前に、CORSを認証より前に配置します
- 最大限の効果を得るため、レスポンス圧縮は早い段階(静的ファイルより前)に配置します
- UseRouting + UseAuthorization + Map* — これらの間にあるミドルウェアからはルートデータを読み取れます
- 組み込み機能:UseHsts、UseHttpsRedirection、UseStaticFiles、UseRateLimiter、UseOutputCache
- UseRoutingとMapXxxの間で
ctx.GetEndpoint()を確認すると、照合されたルート情報を読み取れます
よくある質問
「ミドルウェアの順序と組み込みミドルウェア」レッスンは無料ですか?
はい。「ミドルウェアの順序と組み込みミドルウェア」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「ミドルウェアの順序と組み込みミドルウェア」で何を学びますか?
認証、ルーティング、CORS、例外処理における正しいミドルウェアの順序を理解します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「ミドルウェアの順序と組み込みミドルウェア」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ASP.NET Coreパイプラインの概要
- カスタムミドルウェアの作成
- ショートサーキットと分岐
- ミドルウェアの順序と組み込みミドルウェア