Проблемы с аутентификацией WCF - PullRequest
1 голос
/ 05 августа 2009

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

Сбой согласования интерфейса поставщика поддержки безопасности (SSPI).

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

<system.serviceModel>
    <services>
        <service behaviorConfiguration="XX.ZZ.WebService.MyServiceBehavior"
         name="XX.ZZ.WebService.MyService">
            <endpoint  address="" binding="wsHttpBinding" contract="XX.ZZ.WebService.IMyService">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="XX.ZZ.WebService.MyServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

Буду признателен за некоторые указатели или толчки в правильном направлении.

Ответы [ 3 ]

6 голосов
/ 05 августа 2009

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

У вас есть несколько вариантов:

  • настроить wsHttpBinding (что довольно «тяжеловесно»), чтобы вообще не использовать защиту или использовать защиту имени пользователя / пароля, которую вызывающие абоненты должны будут обеспечить
  • вместо этого используйте basicHttpBinding без защиты (это модель ASMX, в основном)

Чтобы полностью отключить защиту от wsHttpBinding, включите это в вашу конфигурацию:

<bindings>
  <wsHttpBinding>
    <binding name="NoSecurity">
      <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>

, а затем настройте конечные точки для использования этой конфигурации привязки:

<system.serviceModel>
    <services>
        <service name="XX.ZZ.WebService.MyService"
                 behaviorConfiguration="XX.ZZ.WebService.MyServiceBehavior">
           <endpoint address="" 
                     binding="wsHttpBinding" 
                     bindingConfiguration="NoSecurity" 
                     contract="XX.ZZ.WebService.IMyService">
            </endpoint>
            <endpoint address="mex" 
                      binding="mexHttpBinding" 
                      contract="IMetadataExchange" />
        </service>
    </services>

Вы можете сделать то же самое с <basicHttpBinding> вместо <wsHttpBinding>, если хотите (использование wsHttpBinding по сравнению с basicHttpBinding бесполезно, если вы отключили защиту и все другие более продвинутые функции, которые предлагает wsHttpBinding).

Есть также действительно хорошая серия постов в блоге , в которой рассказывается об основах безопасности WCF с точки зрения пяти различных типичных сценариев - отлично читайте!

Марк

2 голосов
/ 05 августа 2009

Это обеспечивает безопасность на транспортном уровне без аутентификации:

<configuration>  <system.serviceModel>
    <services>
      <service 
          name="Microsoft.ServiceModel.Samples.CalculatorService"
          behaviorConfiguration="CalculatorServiceBehavior">
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding1" 
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>  </system.serviceModel>
</configuration>

Для других сценариев я бы взглянул на образцы Microsoft WCF .

2 голосов
/ 05 августа 2009

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

...