Идентичность потока в собственной службе WCF при вызове из веб-приложения - PullRequest
2 голосов
/ 24 декабря 2009

У меня есть служба Windows, которая самостоятельно размещает службу Wcf, эта служба Wcf имеет привязку tcpBinding с настройками по умолчанию. Служба Windows работает как локальная система.

На службу Wcf (настройки по умолчанию) ссылается веб-приложение, работающее в интегрированном конвейере IIS 7.5 в своем собственном пуле приложений со своей собственной идентификацией.

Оба работают на одном компьютере.

Все работает нормально, за исключением того, что в Wcf Service, когда я проверяю идентичность текущего потока с помощью:

Thread.CurrentPrincipal.Identity.Name

Возвращает пользователя пула приложений веб-приложения ... это не то, что я ожидаю. Похоже, что в сервисе Wcf происходит какое-то подражание.

Это стандартное поведение? Я не могу найти документацию по этому вопросу. И значит ли это, что когда я пытаюсь получить доступ к базе данных в сервисе Wcf, я ввожу идентификационный прыжок?

Редактировать , конфигурация на стороне сервиса:

        Type serviceType = typeof(WcfService);
        host = new ServiceHost(serviceType);

        Binding tcpBinding = new NetTcpBinding( );

        Uri tcpBaseAddress = new Uri("net.tcp://localhost:8001/Test");
        host.AddServiceEndpoint(typeof (WcfService), tcpBinding, tcpBaseAddress);

        host.Open();

На стороне клиента:

            NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.Transport);
        windowsService = new WindowsService.WcfServiceClient(tcpBinding, new EndpointAddress("net.tcp://localhost:8001/Test"));

Ответы [ 4 ]

3 голосов
/ 24 декабря 2009

Я читаю из Изучение WCF Микеле Бустаманте. Я использовал WCF для приложения, которое я реорганизовал, и мы заинтересованы в использовании WCF в новых приложениях для гибкости, которую он предлагает. Одним из недостатков WCF является то, что может быть сложно использовать атрибуты .net или файлы .config для правильной настройки параметров. Я потратил дни на отслеживание проблем с настройками WCF. Я даже создал автоматизированные тесты, которые проверят, что мой сервис работает так, как он должен.

Отвечая на ваш вопрос, Мишель очень четко говорит в седьмой главе, что NetTcpBinding является безопасным по умолчанию, что означает, что вызывающие абоненты должны предоставлять учетные данные Windows для аутентификации. Я полагаю, что это объясняет, почему поток, по-видимому, работает как идентификатор веб-службы. Это необходимо для защиты вашего сервиса от несанкционированного вызова.

Я полагаю, что следующая цитата из с. 419-420 ответит на ваш вопрос кратко. «Если вы знакомы с традиционной безопасностью на основе ролей .NET, вы знаете, что к каждому исполняющему потоку прикреплен участник безопасности. Этот участник безопасности хранит личность вызывающего абонента, которая может быть привязана к учетной записи Windows или к пользовательским учетным данным базы данных, и его роли. "

Кажется, прямо говорится, что да , это стандартное поведение.

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

1 голос
/ 02 июня 2010

На самом деле у нас на веб-сайте установлена ​​встроенная система безопасности, а затем любые вызовы с веб-сайта в службу WCF, в которые мы включаем:

        using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate())
        {

Это обеспечивает передачу учетных данных вошедшего в систему пользователя, а не учетных данных пула приложений IIS.

Работает как магия!

1 голос
/ 06 января 2010

Для уточнения:

Я проверял неправильную собственность здесь. Поскольку код будет выполняться под удостоверением WindowsIdentity.GetCurrent ().

По умолчанию это НЕ то же самое, что вызывающий (который находится в Thread.CurrentPrincipal.Identity). Если вы хотите это поведение, вы можете контролировать это с помощью:

host.Authorization.ImpersonateCallerForAllOperations = true;

и

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
0 голосов
/ 24 декабря 2009

Требуется больше информации, но я предполагаю, что где-то в конфигурации для привязки на стороне сервера или на стороне, что олицетворение включено. При добавлении сервисных ссылок svcutil.exe ОЧЕНЬ агрессивен в установке КАЖДОГО возможного свойства привязки в конфигурации.

Если бы вы могли предоставить больше информации о конфигурации на стороне сервера и клиента, это было бы признательно.

...