wsHttpbinding с TransportWithMessageCredential и аутентификацией Windows

У меня есть служба WCF, размещенная в IIS, со следующей конфигурацией привязки (я удалил все атрибуты из привязки для пространства) для wsHttpBinding и TransportWithMessageCredential

   <wsHttpBinding>
    <binding name="BindingName" .../>
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </wsHttpBinding>   

с служебным поведением:

  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceCredentials>
       <userNameAuthentication userNamePasswordValidationMode="Windows" />
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>

Анонимная проверка подлинности отключена, а проверка подлинности Windows включена.

На стороне клиента учетные данные устанавливаются с использованием действительного пользователя и пароля Windows, но я получаю следующее исключение при каждом вызове службы:

HTTP-запрос неавторизован со схемой аутентификации клиента «Анонимный». Заголовок аутентификации, полученный от сервера, был «Negotiate, NTLM». ---> System.ServiceModel.Security.MessageSecurityException: HTTP-запрос неавторизован со схемой аутентификации клиента «Анонимный». Заголовок аутентификации, полученный от сервера, был «Negotiate, NTLM». ---> System.Net.WebException: удаленный сервер возвратил ошибку: (401) неавторизованный.

С собственной версией службы WCF он отлично работает под действующей учетной записью Windows.

Любая помощь приветствуется.


person Sjblack    schedule 10.09.2014    source источник


Ответы (1)


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

Чтобы решить эту проблему, вам необходимо выполнить одно из следующих действий.

1) включить анонимный доступ в IIS, поскольку аутентификация будет обрабатываться на уровне сообщений

or

2) обновите свой режим безопасности, чтобы он был транспортным

<wsHttpBinding>
    <binding name="BindingName" .../>
      <security mode="Transport">
        <transport clientCredentialType="Ntlm" />
      </security>
    </binding>
  </wsHttpBinding>
person Edward    schedule 10.09.2014