Определение идентичности WCF в кластерной среде - PullRequest
1 голос
/ 14 сентября 2011

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

В качестве продолжения этого вопроса об ошибках авторизации WCF я пытаюсь определить, как указать SPN (или это должен быть UPN?) Для службы.
Моя проблема в настоящее время заключается в том, что при попытке связаться со службой я прохожу через балансировщик нагрузки. Балансировщик нагрузки поочередно отправляет меня на один из двух серверов, svcserv1 или svcserv2. Я не указал ничего кроме доменного имени балансировщика нагрузки в своем сервисном коде, но когда приложение подключается к одному серверу, все в порядке, а другой всегда не проходит проверку подлинности.

После включения ведения журнала Kerberos это фрагмент из svcserv1 (виртуальный сервер), который показывает успех. Обратите внимание, что этот успех ссылается на второй сервер (svcserv2), который является физическим сервером.

Logon attempt using explicit credentials:
Logged on user:
User Name:  jsweb
Domain:     DOMAIN
Logon ID:       (0x0,0x6278B2DA)
Logon GUID: {ca6e029d-4073-3f85-5ff5-16514b9acc03}
User whose credentials were used:
Target User Name:   jsweb
Target Domain:  
Target Logon GUID: -
Target Server Name: svcserv2.domain.com
Target Server Info: svcserv2.domain.com
Caller Process ID:  6680
Source Network Address: -
Source Port:    -

Ошибка при связи с svcserv1 и выглядит следующим образом:

Logon attempt using explicit credentials:
Logged on user:
User Name:  jsweb
Domain:     DOMAIN
Logon ID:       (0x0,0x6278B2DA)
Logon GUID: {ca6e029d-4073-3f85-5ff5-16514b9acc03}
User whose credentials were used:
Target User Name:   jsweb
Target Domain:  
Target Logon GUID: -
Target Server Name: svcserv1.domain.com
Target Server Info: svcserv1.domain.com
Caller Process ID:  6680
Source Network Address: -
Source Port:    -

Logon Failure:
Reason:     An error occurred during logon
User Name:  jsweb
Domain:     
Logon Type: 3
Logon Process:  ˜]
Authentication Package: NTLM
Workstation Name:   SVCSERV1
Status code:    0xC000006D
Substatus code: 0x0
Caller User Name:   -
Caller Domain:  -
Caller Logon ID:    -
Caller Process ID:  -
Transited Services: -
Source Network Address: 10.1.36.80
Source Port:    56078

Ответ «Ошибка входа в систему» ​​появляется в средстве просмотра событий от пользователя «NT AUTHORITY \ SYSTEM», поэтому я предполагаю, что именно этот сервис запущен. Идентификатор jsweb (см. Выше) устанавливается в web.config как олицетворяющая личность: <identity impersonate="true" userName="DOMAIN\jsweb" password="password"/> По этой причине мне кажется, что он должен генерировать имя участника-службы (имя хоста / хоста), но в случае кластерной среды имеет больше смысла генерировать имя участника-пользователя (имя пользователя @ имя_домена). Извините, если я не могу быть более конкретным здесь. Есть ли способ для меня, чтобы увидеть, что ожидается / передается? В этой статье говорится, что «если вы установите SPN или UPN равным пустой строке, произойдет множество разных вещей, в зависимости от уровня безопасности и используемого режима аутентификации. Если вы используете безопасность на транспортном уровне, NT LanMan (NTLM) аутентификация выбрана. " Так как я использую

      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows"/>
      </security>

и, по всей видимости?, Имя участника-службы пустое, то по умолчанию используется NTLM. Это можно увидеть в выводе ошибки выше рядом с «Пакетом аутентификации».
Дальнейшая ссылка на MSDN указывает, что «Когда вы используете NT LanMan (NTLM) для аутентификации, идентификация службы не проверяется, потому что в NTLM клиент не может аутентифицировать сервер». Так что это объясняет проблему, но я не смог определить решение. Я не указал <identity> для конечной точки, но попытался использовать кластерное доменное имя ...

<endpoint>
    <identity>
        <dns value="svcserv"/>
    </identity>
</endpoint>

... но это не сработало.

Я нашел эту разочаровывающую статью базы знаний Microsoft под названием « Делегирование аутентификации через Kerberos не работает в архитектурах с балансировкой нагрузки », но я должен верить, что это возможно, поскольку использование балансировщика нагрузки не необычно Возможно, я гоняюсь за своим собственным хвостом, поскольку в « Настройка аутентификации Kerberos по имени кластера Имя участника службы » (в частности, фаза 3: Администрирование клиента) говорится, что «на самом деле никаких специальных шагов не требуется выполняется на клиенте. Клиентский компьютер должен использовать имя участника-службы, зарегистрированное в учетной записи пользователя домена ", поэтому я в зависимости от команды администратора сервера?

Спасибо за любую помощь и не стесняйтесь просить разъяснений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...