WCF - как настроить netTcpBinding для проверки подлинности NTLM?

Я знаю, как настроить basicHttpBinding для проверки подлинности NTLM, но не могу найти способ сделать то же самое для netTcpBinding.

Поддерживает ли netTcpBinding NTLM? Если да, то как заставить службу WCF использовать NTLM?

Кстати, хорошо известный метод, использующий элемент идентичности, по какой-то причине вообще не работал. Я ищу что-то вроде этого - clientCredentialType = "Ntlm", но для tcp. Вот базовая настройка HTTP:

<basicHttpBinding>
  <binding name="BasicHttpBinding">
  <security mode ="TransportCredentialOnly">
  <transport clientCredentialType ="Ntlm"/>
  </security>
  </binding>
</basicHttpBinding>

person ablei2000    schedule 05.02.2010    source источник
comment
Если вы хотите включить фрагменты кода или XML (например, конфигурации), вам нужно выделить эти строки в своем сообщении, а затем использовать кнопку кода (101010) на панели инструментов редактора (или нажать Ctrl-K на клавиатуре), чтобы они красиво отформатированы, а синтаксис выделен. В противном случае ваш пост будет очень трудно читать, а XML даже не появится!   -  person marc_s    schedule 05.02.2010


Ответы (2)


Вот исчерпывающий ответ, который я наконец нашел, протестировал и подтвердил.

A. Мой клиент WCF использовал для динамического создания EndPoint.Address, как показано ниже.

EndPointAddress  myEdpintAddress = new EndPointAddress(stringURL);

Но в случае безопасного транспорта (net.tcp) он должен быть инициализирован следующим образом EndPointAddress myEdpintAddress = new EndPointAddress(new UrRL(string), myEndPointIdentity)

Без параметров EndPointIdentity свойство Identity в объекте EndPointAddress имеет значение NULL и генерирует ошибку «... целевое главное имя неверно ...» на стороне сервера.

Б. Наш контроллер домена поддерживает аутентификацию Kerberos и Ntlm. После выполнения вышеизложенного обычно существует четыре сценария конфигурации на стороне клиента для привязки net.tcp, если безопасность отличается от «Нет», а служба WCF работает как учетная запись домена:

  1. В конечной точке клиента не указано <identity> элементов - вызов WCF не выполняется

  2. Предоставлен элемент <identity>, но с пустым значением для элементов dns, userPrioncipalName или servicePrincipalName - вызов WCF выполнен успешно, но с использованием аутентификации Ntlm

  3. <identity> элемент со значением a для dsn или SPN - вызов WCF выполнен успешно; сервис использует Ntlm для аутентификации.

  4. <identity> элемент имеет правильное значение для upn - вызов WCF выполнен успешно; сервис использует Kerberos для аутентификации. Неверное или отсутствующее значение для аутентификации Ntlm триггера upn

Спасибо.

person ablei2000    schedule 14.02.2010

Net TCP Binding не поддерживает NTLM в качестве типа учетных данных клиента - вы можете выбрать только None, Windows или Certificate (см. Документы MSDN по TcpClientCredentialType).

Итак, в вашем случае попробуйте следующее:

<netTcpBinding>
  <binding name="tcpWindows">
    <security mode ="TransportCredentialOnly">
      <transport clientCredentialType ="Windows"/>
    </security>
  </binding>
</netTcpBinding>

Любая причина, по которой это не работает?

person marc_s    schedule 05.02.2010
comment
Спасибо, marc_s. Это то, что я пытался использовать для привязки tcp в первую очередь, но это не работает - это не вызывает NTLM. Из средства просмотра событий я вижу, что он все еще пытается использовать Kerberos, который не настроен в среде. Следовательно, сервисный вызов не выполняется. Достаточно интересно, что это работает, если я укажу IP-адрес, а не полное имя (имя хоста плюс домен) серверной машины. В этом случае он использует NTLM. Я вижу это в программе просмотра событий. - person ablei2000; 05.02.2010