Передача учетных данных Windows при вызове службы wcf из другой службы wcf - PullRequest
0 голосов
/ 06 мая 2011

У меня следующая проблема:

У меня есть две службы WCF, обе из которых используют basicHttpBinging, определенный как:

    <binding name="DefaultBasicBinding" closeTimeout="01:00:00" openTimeout="01:00:00"
      receiveTimeout="01:00:00" sendTimeout="01:00:00" maxReceivedMessageSize="2147483647">
      <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" />
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows"/>
      </security>
    </binding>

В файле web.config у меня также есть следующие строки:

< authentication mode="Windows"/>
< serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

Тогда у меня есть приложение silverlight, которое вызывает ServiceNo1.На стороне сервера выполняется сервисный метод.В ее теле ServiceNo1 и ServiceNo2 вызываются как клиент.

ServiceNo1 client1 = new ServiceNo1();
client1.ExecuteNextMethod1();


ServiceNo2 client2 = new ServiceNo2();
client2.ExecuteNextMethod2();    

И это прекрасно работает на locahost.Когда это публикуется на dev - начинаются проблемы.

Когда сервисные методы выполняются в методе, вызванном приложением silverlight, генерируется исключение:

Exception type: 
System.ServiceModel.Security.MessageSecurityException  

Message: 
The HTTP request is unauthorized with client authentication scheme 'Negotiate'. 
The authentication header received from the server was 'Negotiate,NTLM'. 

Похоже, учетные данные Windows не передаются.

Настройки, перечисленные выше, также доступны на dev.На обоих серверах (localhost & dev) в IIS установлена ​​«Только аутентификация Windows».

Никто не может мне помочь?

1 Ответ

0 голосов
/ 06 мая 2011

Наиболее вероятно, что на локальном хосте ваш веб-сервер работает под вашими учетными данными. На сервере Dev веб-сервер будет работать под другой учетной записью службы (например, служба пула приложений IIS для вашего приложения).

Лучшим решением для вас будет получить учетную запись службы, под которой ваше приложение будет авторизовано для второй службы.

Существуют альтернативы - используйте свои учетные данные пользователя в качестве учетной записи службы в dev (я предполагаю, что это не вариант в контролируемой среде) или выдавайте себя за свои учетные данные на стороне сервера (опять же - это вряд ли будет уместным в контролируемой среде).

EDIT Лучшим вариантом для вас может быть выдать себя за учетные данные пользователя. См. Эту статью MSDN для реализации. Я не слишком знаком с Silverlight, но вы должны быть в состоянии сделать что-то вроде:

using System.Security.Principal;

------------------------

WindowsImpersonationContext impersonationContext;
impersonationContext = 
    ((.WindowsIdentity)HttpContext.User.Identity).Impersonate();

//Call your service here.

impersonationContext.Undo();

Обратите внимание, что вы можете столкнуться с проблемой Double-Hop , когда Windows не разрешает вам передавать учетные данные пользователей с одного сервера на другой - я прочитал связанную статью для справки.

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