Nguon: Microsoft Learn · .NET 8.0

Lọc Host với máy chủ web Kestrel trong ASP.NET Core

Nguồn: Host filtering with ASP.NET Core Kestrel web server

Mặc dù Kestrel hỗ trợ cấu hình dựa trên các tiền tố như http://example.com:5000, Kestrel phần lớn bỏ qua tên host. Host localhost là trường hợp đặc biệt được dùng để binding (gắn kết) với địa chỉ loopback. Bất kỳ host nào khác ngoài địa chỉ IP tường minh đều binding với tất cả các địa chỉ IP công khai. Header Host không được xác thực.

Để khắc phục, hãy sử dụng Host Filtering Middleware (phần mềm trung gian lọc host). Middleware này được thêm bởi CreateDefaultBuilder, vốn gọi AddHostFiltering:

csharp
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 bị vô hiệu hóa theo mặc định. Để bật middleware, hãy định nghĩa khóa AllowedHosts trong appsettings.json/appsettings.{Environment}.json. Giá trị là danh sách tên host phân cách bởi dấu chấm phẩy, không có số cổng:

appsettings.json:

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

Lưu ý: Forwarded Headers Middleware (phần mềm trung gian chuyển tiếp header) cũng có tùy chọn AllowedHosts. Forwarded Headers Middleware và Host Filtering Middleware có chức năng tương tự nhưng cho các kịch bản khác nhau. Đặt AllowedHosts với Forwarded Headers Middleware phù hợp khi header Host không được giữ lại trong khi chuyển tiếp request (yêu cầu) với reverse proxy server hoặc load balancer. Đặt AllowedHosts với Host Filtering Middleware phù hợp khi Kestrel được dùng làm edge server (máy chủ biên) đối diện công khai hoặc khi header Host được chuyển tiếp trực tiếp.

Để biết thêm thông tin về Forwarded Headers Middleware, xem Cấu hình ASP.NET Core để hoạt động với proxy server và load balancer.