Безопасность WCF с использованием IP-адреса клиента - PullRequest
5 голосов
/ 15 октября 2010

У меня есть служба WCF, которая предоставляет доступ к некоторым данным. Наш клиент попросил ограничить эту услугу таким образом, чтобы данный пользователь мог совершать столько звонков только в течение определенного периода времени. Я хотел установить ограничение скорости запросов и временно запретить этот IP-адрес, если он превысил этот предел.

Однако, как представляется, существует только один способ получить IP-адрес вызывающего абонента с помощью WCF:

var context = OperationContext.Current;
var props = context.IncomingMessageProperties;
var endpoint = props[RemoteEndpointMessageProperty.Name];
return ((RemoteEndpointMessageProperty)endpoint).Address;

Это совершенно бесполезно для меня, потому что RemoteEndpointMessageProperty устанавливается с помощью свойства Request.UserHostAddress HttpContext, в котором он обслуживается. Обычно это было бы хорошо, за исключением того, что наши веб-службы работают за балансировщиком нагрузки, в результате чего Request.UserHostAddress всегда показывает IP-адрес балансировщика нагрузки, а не исходный вызывающий объект.

Я знаю об использовании X-Forwarded-For и тому подобном, и на самом деле уже настроил это на нашем балансировщике нагрузки, но, похоже, у меня нет никакого способа подключиться к http-запросу, чтобы получить доступ к заголовкам за исключением настройка службы WCF для работы в режиме совместимости ASP.NET. Это ДЕЙСТВИТЕЛЬНО мой единственный вариант?

Ответы [ 2 ]

3 голосов
/ 15 октября 2010

Вы можете получить доступ к заголовкам HTTP таким же образом.Вместо RemoteEndpointMessageProperty вы должны использовать HttpRequestMessageProperty.Это свойство содержит коллекцию значений имени заголовков, поэтому вы можете получить любой HTTP-заголовок из входящего запроса.

0 голосов
/ 15 октября 2010

Как надежно связать пользователя с IP-адресом, особенно если пользователь находится за NAT интернет-провайдера (или NAT компании), вы получите только публичный IP-адрес интернет-провайдера.Вместо этого, как насчет идентификации вашего пользователя с помощью ключа API (который делают многие крупные компании, такие как Google и Twitter) или другими способами (например, сертификат клиента), а затем отслеживает использование в хранилище постоянства для регулирования.

Другим вариантом было бы введение такого рода механизма ограничений по IP-адресу на сетевом уровне с использованием правил брандмауэра (я не уверен, что это возможно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...