Ошибка веб-службы поиска SharePoint (NTLM) при вызове из HttpHandler

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

  1. SharePoint Server A, where my site lives
    • Has a service reference to SharePoint search web service on Server 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, - это когда я напрямую предоставляю свои учетные данные. У кого-нибудь есть идеи?

Спасибо.


person TehOne    schedule 12.08.2010    source источник


Ответы (1)


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

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

Вам нужно будет настроить Kerberos. В основном:

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

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

person Nico    schedule 13.08.2010
comment
Спасибо. Я также использовал другой пост, stackoverflow.com/questions/262442/, в котором была та же информация с другими несколькими вариантами использования веб-службы поиска в качестве Что ж. К сожалению, для меня в моей организации кажется, что Kerberos недостаточно хорошо поддерживается, и поэтому я, скорее всего, не смогу его использовать. Мне также сказали, что DisableLoopbackCheck, предложенный в другом посте, тоже не решит мою проблему. Похоже, мне придется найти другой способ сделать то, что мне нужно. Еще раз спасибо. - person TehOne; 17.08.2010