Проблемы с аутентификацией WCF
-
22-07-2019 - |
Вопрос
У меня есть очень простой сервис 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 - он предоставляет хорошие рабочие примеры для различных сред конфигурации.