ASP.NET Core Kestrel Web サーバーでのホストのフィルター処理

Kestrel は http://example.com:5000 などのプレフィックスに基づく構成をサポートしますが、Kestrel はほとんどのホスト名を無視します。 ホスト localhost は、ループバック アドレスへのバインドに使用される特殊なケースです。 明示的な IP アドレス以外のすべてのホストは、すべてのパブリック IP アドレスにバインドします。 Host ヘッダーは検証されません。

これを解決するには、Host Filtering Middleware を使用します。 ミドルウェアは CreateDefaultBuilder によって追加され、そこでは AddHostFiltering が呼び出されます。

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

Host Filtering Middleware は既定では無効です。 このミドルウェアを有効にするには、appsettings.json/appsettings.{Environment}.jsonAllowedHosts キーを定義します。 この値は、ポート番号を含まないホスト名のセミコロン区切りリストです。

appsettings.json:

{
  "AllowedHosts": "example.com;localhost"
}

Note

Forwarded Headers Middleware にも AllowedHosts オプションがあります。 Forwarded Headers Middleware および Host Filtering Middleware には、異なるシナリオ用に類似した機能があります。 リバース プロキシ サーバーまたはロード バランサーを使用して要求を転送するとき、Host ヘッダーが保存されていない場合、Forwarded Headers Middleware に AllowedHosts を設定するのが適切です。 Kestrel が一般向けエッジ サーバーとして使用されていたり、Host ヘッダーが直接転送されたりしている場合、Host Filtering Middleware に AllowedHosts を設定するのが適切です。

Forwarded Headers Middleware の詳細については、「プロキシ サーバーとロード バランサーを使用するために ASP.NET Core を構成する」を参照してください。