Аутентификация Windows с помощью базовой HttpBinding для WCF - PullRequest
3 голосов
/ 23 июня 2009

Я очень раздражен этим за последние 2 часа: (

Люди,

Я пытаюсь получить доступ к веб-службе списка OOTB SharePoint из консольного приложения. Мой сайт SharePoint в IIS установлен в режим встроенной аутентификации Windows, и анонимный доступ отключен.

Теперь на стороне клиента я делаю следующее:

try            
{
   BasicHttpBinding bind = new BasicHttpBinding();
   bind.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
   bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
   EndpointAddress endpoint = new EndpointAddress("http://abc:37379/_vti_bin/lists.asmx");
   ServiceReference1.ListsSoapClient listService
       = new ConsoleApplication1.ServiceReference1.ListsSoapClient(bind, endpoint);
   var elm = listService.GetListItems("Tasks", null, null, null, "10", null, @"06dc3b48-a55e-4db8-8511-acbaf9748e15");
}
catch (Exception ex){
  Console.WriteLine("Message:\n" + ex.Message + "\nDetail:\n" +
  ex.ToString() + "\nStackTrace:\n" + ex.StackTrace);   }

Бум, это вызывает исключение: «HTTP-запрос не авторизован с помощью схемы аутентификации клиента« Согласование ». Заголовок аутентификации, полученный от сервера, был« NTLM ».»

Я действительно хотел сделать что-то вроде следования тому, что мы делали в старой сети 2,0 дня

serviceProxy.Credentials = new NetworkCredentials("username","password","domain");

Какой самый простой способ достичь такого рода обработки учетных данных в новых прокси-классах ??

(Кстати, как вы уже заметили, я использую Binding / endpoint все внутри кода, а не в файле конфигурации, это ограничение для моего приложения. Пожалуйста, не говорите мне, чтобы изменить это - это невозможно).

Может кто-нибудь помочь мне с этим ?? Был бы очень признателен.

1 Ответ

3 голосов
/ 23 июня 2009

IIRC это происходит, когда веб-сервер пытается вернуться к ntlm, когда вы указали kerberos (windows) в привязке.

Вы должны быть в состоянии изменить эту строку кода

bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

до

bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;

если вам нужен Kerberos для работы, вам необходимо убедиться, что служба на веб-сервере работает под той же учетной записью, что и в активном каталоге для имени принципа службы.

Если вы хотите указать учетные данные, используйте фабрику каналов для создания клиента, и прежде чем открывать канал, установите соответствующие учетные данные в свойстве учетных данных фабрики каналов. Например:

var cf = new ChannelFactory<IServiceInterface>(
    bind, endpoint);
cf.Credentials.UserName.UserName = "domain\\someuser";
cf.Credentials.UserName.Password = "password";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...