Sử dụng connection middleware với máy chủ web Kestrel trong ASP.NET Core
Kestrel hỗ trợ connection middleware (phần mềm trung gian kết nối). Connection middleware là phần mềm được tập hợp vào một connection pipeline (đường ống kết nối) và chạy khi Kestrel nhận được một kết nối mới. Mỗi thành phần:
- Chọn xem có chuyển yêu cầu sang thành phần tiếp theo trong pipeline hay không.
- Có thể thực hiện công việc trước và sau thành phần tiếp theo trong pipeline.
Connection delegate (ủy quyền kết nối) được sử dụng để xây dựng connection pipeline. Connection delegate được cấu hình bằng phương thức ListenOptions.Use.
Connection middleware khác với ASP.NET Core Middleware. Connection middleware chạy trên mỗi kết nối thay vì trên mỗi yêu cầu.
Connection logging
Connection logging (ghi nhật ký kết nối) là connection middleware được tích hợp sẵn trong ASP.NET Core. Gọi UseConnectionLogging để xuất ra các log ở mức Debug (gỡ lỗi) cho giao tiếp ở cấp byte trên một kết nối.
Connection logging rất hữu ích để khắc phục sự cố trong giao tiếp cấp thấp, chẳng hạn như trong quá trình mã hóa TLS và phía sau các proxy. Nếu UseConnectionLogging được đặt trước UseHttps, traffic (lưu lượng) được mã hóa sẽ được ghi lại. Nếu UseConnectionLogging được đặt sau UseHttps, traffic đã được giải mã sẽ được ghi lại.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});Tạo custom connection middleware
Ví dụ sau đây minh họa một custom connection middleware (phần mềm trung gian kết nối tùy chỉnh) có thể lọc TLS handshake (bắt tay TLS) trên từng kết nối theo các cipher (thuật toán mã hóa) cụ thể nếu cần. Middleware ném ra NotSupportedException cho bất kỳ cipher algorithm (thuật toán mã hóa) nào mà ứng dụng không hỗ trợ. Ngoài ra, có thể định nghĩa và so sánh ITlsHandshakeFeature.CipherAlgorithm với danh sách các cipher suite được chấp nhận.
Không có mã hóa nào được sử dụng với cipher algorithm CipherAlgorithmType.Null.
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
listenOptions.Use((context, next) =>
{
var tlsFeature = context.Features.Get<ITlsHandshakeFeature>()!;
if (tlsFeature.CipherAlgorithm == CipherAlgorithmType.Null)
{
throw new NotSupportedException(
$"Prohibited cipher: {tlsFeature.CipherAlgorithm}");
}
return next();
});
});
});