Как ограничить доступ к службе WCF с общим ключом - PullRequest
7 голосов
/ 15 сентября 2009

У меня есть несколько служб, которые используются клиентами в безопасной зоне. Меня попросили защитить эти сервисы, как правило, от клиентов-разработчиков, ошибочно подключающихся к неправильному сервису.

Идея состояла в том, чтобы предварительно предоставить общий ключ (например, guid), который устанавливается в конфигурации как для клиента, так и для узла службы. Всякий раз, когда клиент пытается использовать услугу, он должен предоставить правильный ключ.

Как бы я сконфигурировал сервис для реализации этого типа безопасности? Сколько настройки необходимо?

Ответы [ 3 ]

3 голосов
/ 15 сентября 2009

Вы можете легко добавить собственный заголовок сообщения к каждому вызову - на самом деле, это довольно просто, и это не «загрязняет» ваш реальный контракт на обслуживание, например. вам не нужно добавлять дополнительные параметры к вашим служебным вызовам, просто чтобы передать это.

См. Эти статьи для получения информации о том, как этого добиться:

По сути, вам нужно заключить вызов службы в OperationContext - и все, для этого не требуется ClientMessageInspector и другие хитрости: -)

 using (OperationContextScope scope = new OperationContextScope(proxy))
 {
     Guid myToken = Guid.NewGuid();

     MessageHeader<Guid> mhg = new MessageHeader<Guid>(myToken);
     MessageHeader untyped = mhg.GetUntypedHeader("token", "ns");

     OperationContext.Current.OutgoingMessageHeaders.Add(untyped);

     proxy.DoOperation(...);
  }

и на стороне сервера вы можете просто проверить коллекцию IncomingMessageHeaders:

Guid myToken = OperationContext.Current.
                 IncomingMessageHeaders.GetHeader<Guid>("token", "ns");

Марк

2 голосов
/ 15 сентября 2009

Я бы попросил клиента отправить ключ в качестве дополнительного заголовка сообщения и создать IDispatchMessageInspector, чтобы проверить заголовок и при необходимости отклонить его. В этой статье Code Project описана часть фильтра на основе IP-адреса.

0 голосов
/ 15 сентября 2009

Если вы сделаете это с помощью ключа, вы измените контракт службы на поле, в которое будет помещен ключ. Затем проверьте значение в ключе на стороне сервера.

Тем не менее, в вашем случае вы можете ограничить, какие IP-адреса были разрешены для доступа к службе, через конфигурацию сети. Это будет меньше работы, чем изменение подписи ваших услуг.

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