Tôi có dịch vụ WCF cung cấp quyền truy cập vào một số dữ liệu. Khách hàng của chúng tôi đã yêu cầu dịch vụ này bị giới hạn sao cho một người dùng nhất định chỉ có thể thực hiện quá nhiều cuộc gọi trong một khoảng thời gian nhất định. Suy nghĩ của tôi là thiết lập giới hạn tốc độ yêu cầu và đưa ra lệnh cấm tạm thời cho địa chỉ IP đó sau khi vượt quá giới hạn đó.Bảo mật WCF bằng địa chỉ IP của khách hàng
Tuy nhiên, dường như có một cách duy nhất để có được IP của người gọi sử dụng WCF:
var context = OperationContext.Current;
var props = context.IncomingMessageProperties;
var endpoint = props[RemoteEndpointMessageProperty.Name];
return ((RemoteEndpointMessageProperty)endpoint).Address;
Đây không phải là hữu ích cho tôi chút nào vì RemoteEndpointMessageProperty được thiết lập bằng cách sử dụng tài sản Request.UserHostAddress của HttpContext theo đó nó đang được phục vụ. Thông thường, điều đó sẽ ổn, ngoại trừ các dịch vụ web của chúng tôi đang ngồi phía sau bộ cân bằng tải khiến Request.UserHostAddress luôn hiển thị IP của bộ cân bằng tải, không phải là người gọi ban đầu.
Tôi biết về việc sử dụng X-Forwarded-For và như vậy, và thực sự đã có cấu hình trên cân bằng tải của chúng tôi, nhưng dường như không có cách nào để tôi yêu cầu http truy cập vào tiêu đề ngắn thiết lập dịch vụ WCF để hoạt động trong chế độ tương thích ASP.NET. Có phải REALLY này là lựa chọn duy nhất của tôi không?
Cuối cùng, câu trả lời này là hợp lệ, vì vậy tôi chấp nhận nó, nhưng .NET 3.5 và lớn hơn đã thêm một lớp WebOperationContext vào không gian tên System.ServiceModel.Web mà làm cho việc này dễ dàng hơn một chút. – Chris
Có, nhưng giải pháp này là chung cho tất cả các ràng buộc dựa trên Http. WebOperationContext chỉ hoạt động cho các dịch vụ REST (được hiển thị trên WebHttpBinding). –