Настройка безопасности WCF (wsHttpBinding) - PullRequest
2 голосов
/ 29 ноября 2010

У меня есть два сайта, размещенные на одном сервере IIS. SiteA содержит службы WCF, к которым должен обращаться SiteB, а также все, что аутентифицировано в домене.

Служба настроена с помощью wsHttpBinding, и поэтому я считаю, что по умолчанию используется безопасность Windows. Прямо сейчас я могу вызвать службы из консольного приложения, работающего на моем локальном компьютере, а также из веб-приложения, работающего на веб-сервере Visual Studio по умолчанию, поэтому я предполагаю, что аутентификация работает.

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

SiteB работает на той же машине, что и SiteA, поэтому я не понимаю, почему он не может быть аутентифицирован. SiteB использует проверку подлинности с помощью форм, и я сопоставил анонимный доступ пользователю домена.

Вот биты конфигурации:

Сайт A (услуга):

<system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
        <services>
            <service behaviorConfiguration="wcfServiceBehaviour" name="MyService">
                <endpoint address="" binding="wsHttpBinding" contract="IServiceContract" />
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="wcfServiceBehaviour">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="true" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>

Сайт B (клиент):

<system.serviceModel>
    <client>
      <endpoint address="http://xxxxx/Services/xxService.svc"
                binding="wsHttpBinding"
                contract="IServiceContract" />
    </client>
</system.serviceModel>

Ответы [ 3 ]

1 голос
/ 29 ноября 2010

Когда SiteB выдает себя за другого пользователя, указывает ли ваш код уровень олицетворения ?

Я предполагаю, что вы не указываете достаточно высокий уровень олицетворения.(Уровень делегирования самый высокий, что позволяет SiteB передавать разрешения другому сервису.)

Я подозреваю, что исправления кода олицетворения SiteB будет достаточно для решения проблемы.

Если нет,попробуйте передать допустимый уровень олицетворения на сервер:

<system.serviceModel>
    <client>
      <endpoint address="http://xxxxx/Services/xxService.svc"
                binding="wsHttpBinding"
                contract="IServiceContract"
                behaviorConfiguration = "ImpersonationBehavior" />
    </client>
      <behaviors>
          <endpointBehaviors>
               <behavior name="ImpersonationBehavior">
                   <clientCredentials>
                       <windows allowedImpersonationLevel = "Delegation" /> <!-- The highest level -->
                   </clientCredentials>
               </behavior>
          <endpointBehaviors>
       </behaviors>
</system.serviceModel>
1 голос
/ 29 ноября 2010

Вы правы - wsHttpBinding, настроенный в WCF, будет использовать проверку подлинности Windows по умолчанию.

Здесь есть предложение - WCF - изменение адреса конечной точки приводит к исключению безопасности - что блок Identity не будет работать с аутентификацией Windows - попробуйте удалить его.

0 голосов
/ 04 ноября 2013

Если вы используете собственный хостинг, такой как я, способ избежать этой проблемы (как описано выше) заключается в том, чтобы на стороне хоста и клиента было указано, что режим безопасности wsHttpBinding = NONE.

При создании привязки как на клиенте, так и на хосте вы можете использовать этот код:

 Dim binding as System.ServiceModel.WSHttpBinding 
 binding= New System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None)

или

 System.ServiceModel.WSHttpBinding binding
 binding = new System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None);
...