аномалия проверки подлинности Windows wcf 4 / iis / server 2008

#wcf

#wcf

Вопрос:

У меня есть тестовая служба WCF 4, запущенная на Windows 2008 / IIS 7.5 в домене.

Я использую проверку подлинности Windows для привязки.

Когда я получаю доступ к этой службе из клиента .net Windows :

 var b = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
EndpointAddress a = new EndpointAddress("http://server/TestService.svc");
TestServiceClient tsc = new TestServiceClient(b, a);                                  
  

Это работает, если я использую:

  tsc.ChannelFactory.Credentials.Windows.ClientCredential = new NetworkCredential("bob.jones", "password", "DOMAIN");
  

Сбой, если я использую:

 tsc.ChannelFactory.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
  

Когда это не удается, я вижу 401 в Fiddler :
«401 — Неавторизованный: доступ запрещен из-за недействительных учетных данных».

Когда это удается, я вижу тот же 401, но затем 200, и я вижу тикет kerboros в запросе и ответе.

Вот моя конфигурация службы:

 <system.serviceModel>

<bindings>
  <basicHttpBinding>
    <binding>
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" proxyCredentialType="Windows"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  

Ответ №1:

Видя, что больше никого это не интересует, я думаю, мне придется ответить на это самому.

В проблеме было много мелких деталей, но я просто дам обзор того, что я нашел :

  1. Мне пришлось использовать провайдера «Negotiate: Kerberos», а не «Negotiate».

  2. Мне пришлось настроить основное имя сервера (spn) для учетной записи домена, которую я использовал для пула приложений :

    setspn -A HTTP/имя_сервера: домен порта Имя пользователя

    setspn -A HTTP/ полное доменное имя: домен порта Имя пользователя

  3. Еще одна вещь, которую я заметил позже в другой службе, где клиентское приложение не указало точный базовый режим httpsecuritymode.TransportCredentialOnly и clientCredentialType = HttpClientCredentialType.Windows, заключалась в том, что разные клиентские компьютеры требовали «Negotiate», а другие требовали «Negotiate: Kerberos». Я еще не выяснил, могу ли я это контролировать.