Я думаю, что эта проблема связана не столько с разработкой программного обеспечения, сколько с общей конфигурацией сети, поэтому сначала я публикую здесь вопрос.
У меня есть приложение MVC4, размещенное в IIS 7.5 на сервере Windows 2008 R2 (назовем его WS1
). Он использует службу WCF на втором идентичном сервере (WS2
). Также на WS2
это установка SharePoint 2007. Служба WCF взаимодействует с SharePoint и поэтому должна работать от имени пользователя, имеющего доступ к моему сайту SharePoint. По этой причине служба WCF настроена на использование проверки подлинности Windows с NTLM в качестве единственного поставщика проверки подлинности Windows (необходимого для SharePoint). Приложение MVC4 на WS1
также настроен для проверки подлинности Windows, NTLM в качестве единственного поставщика и имеет соответствующие параметры безопасности конечных точек WCF:
<binding name="SpBasicHttp" ... >
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
</security>
</binding>
WS1
и WS1
обе являются виртуальными машинами, и хотя они не обязательно находятся на одном хосте, они являются в том же домене.
Теперь, когда я пытаюсь вызвать метод веб-службы из WS1
к WS2
, Я получаю следующую ошибку:
Веб-службы Sharepoint - HTTP-запрос неавторизован со схемой аутентификации клиента «Ntlm». Заголовок аутентификации, полученный от сервера, был NTLM.
Фу. Итак, я включил аудит NTLM на WS2
и я обнаружил, что в основном запрос проверки подлинности NTLM не достигает этого сервера во время вызова веб-службы.
Теперь, если я разверну приложение MVC4 в WS2
и ничего не менять, кроме URL-адреса конечной точки службы WCF, все работает отлично. Проверка подлинности Windows через NTLM работает безупречно, и в средстве просмотра событий четко видна запись аудита проверки подлинности NTLM. Это выглядит как:
Audit NTLM authentication in this domain
User: billybob
Domain: xyz
Workstation: MY-COMPUTER-NAME
PID: 4
Process:
Logon type: 3
InProc: true
Mechanism: (NULL)
Ни на одном компьютере нет параметров групповой политики, предотвращающих исходящие или входящие запросы NTLM. Сеть, в которой я разрабатываю, не настроена для Kerberos, поэтому, к сожалению, это не вариант. У меня также нет доступа к Active Directory.
Итак, с точки зрения администрирования сервера, что могло бы остановить запрос проверки подлинности NTLM на своем пути между двумя серверами, где он отлично работает только на одном сервере?
Похожие вопросы: