2010-07-18 3 views
7

У меня есть веб-сервис WCF, который предоставляет несколько бизнес-методов. У меня также есть два клиента - графический интерфейс asp.net и приложение переноса данных, которые подключаются к wcf-серверу для вызова различных бизнес-транзакций.Идентификация ID клиента WCF

Мне нужен мой сервер, чтобы иметь возможность идентифицировать и различать, какой клиент wcf совершил вызов какой-либо логики вариантов.

Есть ли способ, которым мой сервис WCF может идентифицировать клиентов, подключенных к нему? Также есть способ использовать подписанный ключ, чтобы клиент не мог подменять свою личность?

+0

Есть ли у Вас пример сценария такой операции, которая должна вести себя по-разному в зависимости от вызывающий? Возможно, вам стоит рассмотреть возможность применения аутентификации и авторизации вместо того, чтобы выполнять операции, которые ведут себя по-разному в зависимости от вызывающего. – Alex

+0

Да ... у нас есть несколько сценариев, которые нужно обрабатывать по-разному в бэкэнд в зависимости от того, какой клиент WCF подключается. – Hady

ответ

14

Вы можете решить эту проблему с помощью настраиваемого заголовка.

Вы можете добавить пользовательский заголовок как часть конечной точки в конфигурационном файле клиентского приложения. Затем вы создадите пользовательский заголовок каждого клиента. Например, в версии ASP.NET:

 <endpoint 
      name="basicHttpEndpoint" 
      address="http://localhost:8972" 
      binding="basicHttpBinding" 
      contract="MySeriveContractLib.IMyService" 
      > 
      <headers> 
       <ClientIdentification>ASP_Client</ClientIdentification> 
      </headers> 
     </endpoint> 

Затем служба может проверить значение заголовка следующим образом:

public void MyServiceMethod() 
{ 
    var opContext = OperationContext.Current; 
    var requestContext = opContext.RequestContext; 
    var headers = requestContext.RequestMessage.Headers; 
    int headerIndex = headers.FindHeader("ClientIdentification", ""); 
    var clientString = headers.GetHeader<string>(headerIndex); 
    if clientString=="ASP_Client" 
    { 
     // ... 
    } 
    else 
    { 
     // ... 
    } 
} 
3

Чтобы идентифицировать тип вызывающего абонента (ASP.NET или WInforms или что-то еще), вам, вероятно, необходимо добавить настраиваемый заголовок в ваши сообщения WCF - служба не может ничего знать о вызывающем клиенте, часть сообщения или отправленные заголовки. Для этого лучше всего написать WCF Message Inspector - и этот blog post here покажет вам, как это сделать.

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

WCF Guru Juval Löwy имеет действительно хорошую статью в журнале MSDN, Declarative WCF Security, которая описывает пять общих сценариев безопасности в WCF и способы их реализации. Очень рекомендуемое чтение.

+0

Является ли «Инспектор сообщений» один на один, эквивалентный ответу Эндрю; просто другой способ сделать то же самое? Или есть смысл использовать Инспектор? – OmegaMan