2010-10-14 45 views
5

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?

Trả lời

3

Bạn có thể truy cập HTTP header trong cùng một cách. Thay vì RemoteEndpointMessageProperty bạn phải sử dụng HttpRequestMessageProperty. Thuộc tính này chứa bộ sưu tập giá trị tên Tiêu đề để bạn có thể nhận được bất kỳ tiêu đề HTTP nào từ yêu cầu đến.

+1

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

+0

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). –

0

Làm cách nào để kết nối người dùng với địa chỉ IP một cách đáng tin cậy nếu người dùng đứng sau ISP NAT (hoặc Công ty NAT), bạn sẽ chỉ nhận được Địa chỉ IP công khai của ISP. Thay vào đó, cách xác định người dùng của bạn bằng cách sử dụng Khóa API (nhiều chuyên ngành như Google và Twitter đang thực hiện) hoặc bằng các phương tiện khác (chẳng hạn như chứng chỉ ứng dụng khách) và sau đó theo dõi việc sử dụng trong kho lưu trữ lâu dài để điều chỉnh.

Một lựa chọn khác sẽ được giới thiệu loại này của cơ chế hạn chế bởi địa chỉ IP ở lớp mạng sử dụng quy tắc tường lửa (Tôi không có kinh nghiệm bằng cách giả sử nó là có thể)

+0

Dịch vụ web sẽ được truy cập trực tiếp qua quảng cáo biểu ngữ. Không có cơ hội để chỉ định một khóa cụ thể cho từng người dùng. Tôi nhận thức được sự nguy hiểm của việc giới hạn IP, nhưng đó là tất cả những gì chúng tôi có vào lúc này. – Chris

+0

Ok, vậy làm thế nào về tính khả thi của việc hạn chế yêu cầu bằng IP sử dụng một số loại tường lửa hoặc hệ thống phát hiện xâm nhập thay vì ở lớp ứng dụng. – softveda

Các vấn đề liên quan