Вопрос

У меня есть очень простой сервис 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>

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

Это было полезно?

Решение

Итак, ваша служба использует 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 вместо wsHttpBinding бесполезно).BasicHttpBinding, если вы отключили безопасность и все другие более продвинутые функции, которые предлагает wsHttpBinding).

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

Марк

Другие советы

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

<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 .

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top