Ошибка веб-службы поиска SharePoint (NTLM) при вызове из HttpHandler - PullRequest
0 голосов
/ 13 августа 2010

Вот мой сценарий: у меня есть сайт SharePoint, над которым я работаю, и он находится на одной ферме серверов. На этом сайте я создал HttpHandler, который использует веб-службу поиска SharePoint, расположенную на другом сервере. Так это выглядит примерно так:

  1. SharePoint Server A, где живет мой сайт
    • Имеет ссылку на службу веб-службы поиска SharePoint на сервере B
    • Имеет обработчик http, который использует сервисную ссылку для вызова службы поиска
  2. SharePoint Server B, где находится служба поиска

Мой код выглядит так:

BasicHttpBinding binding = new BasicHttpBinding();

binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;

QueryServiceSoapClient _queryService = new QueryServiceSoapClient(binding, new EndpointAddress("http://easearch.ea.com/_vti_bin/search.asmx"));
_queryService.ClientCredentials.Windows.AllowNtlm = true;
_queryService.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
_queryService.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
//_queryService.ClientCredentials.Windows.ClientCredential = new NetworkCredential("MyUsername", "MyPassword", "MyDomain"); //This is the only way it seems to work
//NetworkCredential userCredential = CredentialCache.DefaultCredentials.GetCredential(_queryService.Endpoint.ListenUri, "NTLM");
//_queryService.ClientCredentials.Windows.ClientCredential = userCredential;

string status = _queryService.Status();

Если я использую этот код из консольного приложения на моем компьютере разработчика, он работает как положено. Но когда я пытаюсь использовать тот же код из моего обработчика http, он выдает ошибку

HTTP-запрос не авторизован с схема аутентификации клиента 'Ntlm'. Заголовок аутентификации получен с сервера был 'NTLM'.

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

Спасибо.

1 Ответ

1 голос
/ 13 августа 2010

NTLM не может делегировать учетные данные удаленному серверу.

Это известно как проблема "двойного прыжка". http://blogs.technet.com/b/askds/archive/2008/06/13/understanding-kerberos-double-hop.aspx

Вам придется настроить Kerberos. В основном:

  • Настройка SharePoint для использования Kerberos (в «провайдере проверки подлинности» в центре администрирования)
  • Создание имени участника-службы для SharePoint в учетной записи пула приложений (с помощью командной строки "setspn")
  • Создайте имя участника-службы для веб-сайта, запущенного на сервере B, в учетной записи приложения, работающей на этом сайте
  • Настройка делегирования между 2

Да, Kerberos не так просто установить ...

...