ASP.NET Core 6/İstekleri Başlığına Göre Filtreleme

Her HTTP isteği bir host başlığı içerir. Aynı hostun aynı portuna giden istekler bu başlığın değerine göre sunucuda farklı muamele görebilir. Request pipeline'a varsayılan durumda eklenen UseHostFiltering() middleware'i sadece onay verilen host değerlerinden biri istekte varsa isteği işleme, istekte onay verilen host değerlerinden biri yoksa isteği gözardı etme yeteneğine sahiptir. Varsayılan durumdaki appsettings.json dosyası değeri "*" olan bir "AllowedHosts" girdisi içerir. "*" değeri host değeri ne olursa olsun bütün isteklerin işleneceği anlamına gelir. Kabul edilen host değerleri burada belirtilebilir veya program içinden options pattern'i kullanılarak değiştirilebilir. Örnek:

using Microsoft.AspNetCore.HostFiltering;
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<HostFilteringOptions>(opts => {
    opts.AllowedHosts.Clear();
    opts.AllowedHosts.Add("*.example.com");
});
var app = builder.Build();
app.Run(async context => {
    await context.Request.WriteAsync("Terminal middlewarer");
});
app.Run();

UseHostFiltering() middleware'inin ayar sınıfı HostFilteringOptions'tır. Önemli özellikleri aşağıda belirtilmiştir:

AllowedHosts: İzin verilen host değerlerini belirtir (List<string>). Belirtimde joker karakterler kullanılabilir. Örneğimizde example.com hostunun bütün alt domain'lerine izin verilmektedir.
AllowEmptyHosts: Host başlığı olmayan isteklere izin verilip verilmeyeceğini belirtir. Varsayılanı true'dur.
IncludeFailureMessage: Eğer talep reddedildiyse geriye reddedilme gerekçesini içeren bir mesaj döndürülüp döndürülmeyeceğini belirtir. Varsayılanı true'dur.

Eğer host ismi sebebiyle talep reddedilirse UseHostFiltering() middleware'i geriye HTTP 400 hata kodunu döndürür.