Использование WebService со встроенной аутентификацией из приложения Windows WPF - PullRequest
2 голосов
/ 19 марта 2010

Я написал приложение Windows WPF 4.0, которое использует .net 3.5 WebService. Это прекрасно работает, когда веб-сервис размещен, чтобы разрешить анонимные подключения, однако WebService, который мне нужно использовать, когда мы начнем работать, будет поддерживаться на веб-сайте с включенной встроенной аутентификацией.

Человек, работающий с приложением WPF, будет зарегистрирован на компьютере в том же домене, что и веб-сервер, и у него будет разрешение на просмотр веб-службы (без ввода информации об авторизации) при переходе к ней с помощью веб-браузера с аутентификацией NTLM. включен.

Можно ли передать сведения о уже вошедшем в систему пользователе, выполняющем приложение, в WebService?

Вот код, который я сейчас использую:

MyWebService.SearchSoapClient client = new SearchSoapClient();
//From the research I've done I think I need to something with these:
//UserName.PreAuthenticate = true;
//System.Net.CredentialCache.DefaultCredentials;
List<Person> result = client.FuzzySearch("This is my search string").ToList();

Любые указатели высоко ценятся.

Вот сообщение об ошибке, которое я получаю, когда выполняется текущий вызов:

HTTP-запрос не авторизован с схема аутентификации клиента 'Anonymous'. Заголовок аутентификации получил с сервера был «Переговоры, NTLM, Digest QOP = "аутентификация", алгоритм MD5 =-Sess, Nonce = "+ модернизированные + V17 {hashremoved}", кодировка = UTF-8, сфера = "Дайджест".

1 Ответ

5 голосов
/ 19 марта 2010

Так что получается, что решение этой проблемы очень просто в моем случае.

В конфигурации привязки для WebService в файле App.Config я изменил это:

<security mode="None">
  <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
 <message clientCredentialType="UserName" algorithmSuite="Default" />
</security>

К этому:

<security mode="TransportCredentialOnly">
 <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
 <message clientCredentialType="UserName" algorithmSuite="Default" />
</security>

Примечание. Я изменил атрибуты Mode и clientCredentialType.

И в коде ниже я добавил эту строку перед вызовом метода в WebService:

client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
...