13 января 2013 г.

Фильтрация IP адресов при доступе к WCF сервису

Продолжая тему разработки REST сервисов на платформе WCF, хотелось бы поговорить о способах защиты ваших сервисов от несанкционированного доступа. В этой статье мы поговорим о такой мере защиты, как ограничение доступа на основе фильтрации по IP адресу.

Используя технологии от Microsoft такую возможность можно обеспечить на разных программных уровнях. Далее мы посмотрим как можно включить IP фильтр на сервере IIS и как контролировать доступ к методам на уровне WCF.

 

Ограничение доступа на уровне IIS

Сразу можно отметить, что это наиболее эффективный способ, так как запросы от заблокированных IP адресов блокируются на уровне сервера и не передаются в контекст выполнения WCF или ASP. Однако, есть существенный недостаток – список адресов должен быть статическим, и задаваться на уровне каждого сервера.

Для активации IP фильтра в IIS необходимо включить следующую опцию в настройках компонентов системы Windows, после чего в консоли IIS должна появиться опция «Ограничения IP адресов и доменов»:

image

Теперь можно устанавливать список разрешенных и запрещенных IP адресов для отдельных сайтов или всего сервера.

 

Ограничение доступа на уровне WCF

Рассмотрим следующий сценарий: у нас есть список заблокированных адресов (он может хранится в базе данных, к примеру), при получении нового запроса сервис WCF должен проверить, не находится ли IP адрес клиента в черном списке.

В WCF существует класс ServiceAuthorizationManager, который позволяет разработчикам создавать собственные модули авторизации запросов.

Создадим класс IpServiceAuthorizationManager, унаследовав его от ServiceAuthorizationManager.

   1:  public class IpServiceAuthorizationManager : ServiceAuthorizationManager
   2:  {
   3:      private List<string> _blockedIPs;
   4:          
   5:      public override bool CheckAccess(OperationContext operationContext)
   6:      {
   7:          MessageProperties messageProperties = operationContext.IncomingMessageProperties;
   8:          var endpointProperty = messageProperties[RemoteEndpointMessageProperty.Name];
   9:   
  10:          string currentIP = ((RemoteEndpointMessageProperty)endpointProperty).Address;
  11:              
  12:          return !_blockedIPs.Contains(currentIP);
  13:      }
  14:  }

Метод CheckAccess возвращает булевское значение, которое обозначает успешно ли клиент прошел этот модуль авторизации. Если будет возвращено значение true – запрос будет пропущен дальше, а если false – запрос оборвется и клиент получит ошибку 400 (Bad Request).

Созданный менеджер необходимо зарегистрировать в конфигурации сервиса:

   1:  <serviceBehaviors>
   2:    <behavior>
   3:      <serviceAuthorization serviceAuthorizationManagerType="WcfIPAuth.IpServiceAuthorizationManager, 
   4:          WcfIPAuth, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
   5:    </behavior>
   6:  </serviceBehaviors>

Мы рассмотрели сценарий фильтрации по IP всех клиентов, которые хотят получить доступ к нашему WCF сервису. Однако, давайте пойдем еще дальше. Допустим, нам необходимо применить подобный фильтр не для всего сервиса, а только для отдельных его методов.

Предположим у нас есть следующий контракт сервиса:

   1:  [ServiceContract]
   2:  public interface IService1
   3:  {
   4:      [OperationContract]
   5:      [WebGet]
   6:      string A(int value);
   7:   
   8:      [OperationContract]
   9:      [WebGet]
  10:      string B(int value);
  11:  }

Нам необходимо сделать так, чтобы метод А мог получать запросы от любых клиентов, а метод В – только от клиентов, чей IP находится в списке разрешенных адресов.

Чтобы реализовать данный сценарий нам понадобятся интерфейсы IParameterInspector и IOperationBehavior.

Создадим класс IpSecurityInspector:

   1:  public class IpSecurityInspector : Attribute, IParameterInspector, IOperationBehavior
   2:  {
   3:      private List<string> _blockedIPs;
   4:   
   5:      public object BeforeCall(string operationName, object[] inputs)
   6:      {
   7:          MessageProperties messageProperties = OperationContext.Current.IncomingMessageProperties;
   8:          var endpointProperty = messageProperties[RemoteEndpointMessageProperty.Name];
   9:   
  10:          string currentIP = ((RemoteEndpointMessageProperty)endpointProperty).Address;
  11:   
  12:          if (_blockedIPs.Contains(currentIP))
  13:          {
  14:              throw new WebException("Your IP is blocked", WebExceptionStatus.RequestCanceled);
  15:          }
  16:   
  17:          return null;
  18:      }
  19:   
  20:      public void ApplyDispatchBehavior(OperationDescription operationDescription, 
  21:          DispatchOperation dispatchOperation)
  22:      {
  23:          dispatchOperation.ParameterInspectors.Add(this);
  24:      }
  25:  }

В методе ApplyDispatchBehavior регистрируется класс-инспектор, методы которого (BeforeCall и AfterCall) будут выполнятся при каждом обращении к методу.

В методе BeforeCall мы получаем IP адрес клиента из текущего контекста запроса и проверяем его по списку разрешенных адресов. В случае, если адрес клиента в списке отсутствует – выбрасывается исключение.

Теперь, осталось только применить атрибут IpSecurityInspector к методу «В» контракта сервиса:

   1:  [ServiceContract]
   2:  public interface IService1
   3:  {
   4:      [OperationContract]
   5:      [WebGet]
   6:      string A(int value);
   7:   
   8:      [IpSecurityInspector]
   9:      [OperationContract]
  10:      [WebGet]
  11:      string B(int value);
  12:  }

Выводы

В этой статье мы реализовали несколько сценариев ограничения доступа к WCF сервису, путем фильтрации IP адресов входящих запросов. В зависимости от требований, вы можете выбрать наиболее подходящий сценарий при разработке вашего WCF сервиса.

1 комментарий:

  1. Best mount steel - Ridge Titanium Wallet - Kitkat - Apple
    Looking for Mount Steel for Apple Apple Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning camillus titanium Stunning Stunning Stunning Stunning Stunning titanium nitride gun coating Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning thunder titanium lights Stunning Stunning Stunning Stunning Stunning titaum Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning stiletto titanium hammer Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning Stunning St

    ОтветитьУдалить