Олицетворение и CredentialCache.DefaultCredentials дают HTTP 401 неавторизованным - PullRequest
3 голосов
/ 08 апреля 2009

У меня есть веб-служба ASMX (на моем локальном хосте - WinXP IIS 5.1), которую я вызываю с веб-клиента. Мой веб-сервис должен использовать другой веб-сервис ASMX (на сервере Windows 2003 IIS 6.0).

Когда я предоставляю учетные данные в своем коде веб-сервиса «жестко»:

engineWSE.Credentials = new System.Net.NetworkCredential("myUser", "myPass", "myDomain");

... последующий вызов удаленного веб-сервиса работает нормально .

Теперь я пытаюсь выдать себя за какое-то начальное тестирование. Мое первоначальное прочтение говорит мне, что это может быть большой темой, но вот что я сделал для начала:

  1. ОТКЛОНЕНО "Анонимный доступ" в моем виртуальный каталог для веб-клиента сайт на моем локальном хосте

  2. в web.config моего сайта веб-клиента, я установил: режим аутентификации = "Windows" и личность impersonate = "true"

  3. в веб-методе моего веб-сервиса, который должен вызывать удаленный сервис, Я изменил на:

    engineWSE.Credentials = System.Net.CredentialCache.DefaultCredentials;
    
  4. Когда удаленный веб-сервис вызывается с этими DefaultCredentials, я получаю следующая ошибка:

    System.Web.Services System.Web.Services.Protocols.SoapException: серверу не удалось обработать запрос .--->

    System.Net.WebException: запрос не выполнен с состоянием HTTP 401: не авторизован.

    в System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse (Сообщение SoapClientMessage, ответ WebResponse, поток responseStream, логический asyncCall)

    в System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke (String methodName, Object [] параметры)

Я не уверен, что я неправильно понял и попытался чрезмерно упростить «Олицетворение» или удаленный веб-сервис каким-то образом подключен, чтобы принимать учетные данные только с 3 аргументами (то есть имя пользователя, пароль, домен).

Ответы [ 5 ]

2 голосов
/ 05 мая 2014

Как сказал @Michael Levy, это проблема двойного прыжка. Это означает, что до тех пор, пока вы не настроите Kerberos (Negotiate), NTLM, вероятно, будет использоваться в среде Windows, в которой работает IIS, при этом клиент с браузером на компьютере A, пытающийся получить доступ к веб-сайту на компьютере B, будет иметь доступ к сайту, НО, когда сайт попытается связаться со службой на компьютере C, вместо этого следует использовать учетные данные пула.

То же самое относится и к веб-сайту A, вызывающему услугу B, которая, в свою очередь, вызывает услугу C.

При настройке Kerberos для веб-сайтов необходимо учитывать несколько факторов. Во-первых, нужно знать, ферма это или нет. Если это так, вы должны определить общего пользователя для пула для всех машин, входящих в ферму. Это необходимо, потому что Kerberos использует доменное имя для идентификации принципала, используемого для шифрования токенов безопасности. Если у вас есть разные пользователи на разных компьютерах одной фермы, так как все они будут доступны через одно и то же доменное имя, все запросы будут искать та же запись. Более подробную информацию можно найти здесь на Kerberos и балансировке нагрузки .

Например, скажем, у вас есть сайт с myApp.intranet в качестве URL. В AD вы должны иметь имя участника-службы, скажем, myUser в домене MyDomain (setspn -S MyDomain \ myUser HTTP / myapp.intranet). Когда запрос отправляется в KDN (см. Ссылки Kerberos в конце для получения дополнительной информации о KDN), он всегда будет возвращать токен, зашифрованный с помощью myUser, но IIS будет пытаться расшифровать его другими пользователями. Может быть заманчиво создать несколько SPN для одной и той же службы (HTTP / myapp.intranet), но это приведет к ошибке KRB.

Кроме того, если вы работаете в IIS 7+, вам нужно будет указать немного деталей в своем ApplicationHost.config, если вы хотите оставить аутентификацию в режиме ядра включенной (что настоятельно рекомендуется): useAppPoolCredentials = верно. Это значение должно быть установлено в файле configuration \ system.webServer \ security \ authentication \ windowsAuthentication. Это связано с тем, что по умолчанию аутентификация в режиме ядра будет использовать учетную запись компьютера , а не учетную запись пула, и это вернет нас к многопользовательскому сценарию.

Во всех случаях Доверяйте этому пользователю для ... вкладки Делегирование субъекта AD должно быть разрешено для работы делегирования. Затем вы должны решить, хотите ли вы использовать общее или ограниченное делегирование.

Как я уже говорил ранее, вам также нужно установить имя участника-службы для подходящего пользователя и нужного сервиса. Пользователь довольно легко определить, так как это будет тот, который вы определили для своего пула, но служба может быть немного хитрой в зависимости от вашей конфигурации. DNS, браузер и, возможно, другие переменные могут изменить то, что следует использовать. Наши испытания и ошибки показали следующее:

  • Если ваша DNS-запись является записью A, вы используете ее напрямую
  • Если ваша запись является CName, в наших тестах использовалась связанная с ней запись A
  • У нас были случаи, когда использовалось CName, и оно, похоже, было связано с версией браузера.

Обратите внимание, что если имя SPN не задано и вы обращаетесь к своему веб-сайту через имя NetBIOS, будет запрошена служба HTTP / машина, и по умолчанию служба HOST (поиск дополнительных) может быть используется вместо HTTP, поэтому будет использоваться HOST / machine. Это может быть полезно для простой настройки в небольшой сети.

Также следует иметь в виду, что если вы хотите ограничить время простоя при переходе от NTLM к Kerberos, вам следует сначала изменить ApplicationHost, а затем использовать SetSPN. Вы также можете отключить согласование перед любым действием и оставить только NTLM, пока все не будет настроено, а затем, если возможно, включить только согласование (без NTLM). Это должно заставить клиентов изменить способ доступа к вашему веб-сайту. Если вы этого не сделаете, механизм кэширования, похоже, будет некоторое время поддерживать NTLM.

Надеясь, что это может помочь. Если вам все еще не удается настроить Kerberos, WireShark - ваш самый верный друг Вы можете найти информацию о том, как отлаживать Kerberos, на следующих страницах: - Отладка Kerberos для веб-сайта - Отладка проблем AD с Kerberos (одним из них является максимальный размер токена) - Kerberos инструменты и другие ссылки - Общий захват сети Отладка Kerberos

1 голос
/ 08 апреля 2009

Использовали ли вы netmon или wireshark, чтобы убедиться, что учетные данные передаются? О чем говорит журнал на сервис-провайдере? Также убедитесь, что в web.config (или другом .config) не настроен тег олицетворения.

EDIT:

Возможно, это блок HostingEnvironment.Impersonate (), который по умолчанию использует идентификатор пула приложений или идентификатор любого пользовательского токена, который вы передаете.

0 голосов
/ 19 декабря 2011

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

0 голосов
/ 17 апреля 2009

@ Майкл Книскерн - Это возможно с HTTP. Олицетворенная функция передает учетные данные из приложения ASP.Net в IIS. Благодаря встроенной аутентификации Windows учетные данные конечного пользователя будут использоваться вместо учетной записи ASPNET по умолчанию (или учетной записи, присоединенной к пулу приложений). Я полагаю, что упоминание статьи MSDN в отношении HTTP и FTP было направлено на DefaultNetworkCredentials.

0 голосов
/ 08 апреля 2009

Согласно следующей статье MSDN , он не будет работать для протоколов HTTP и FTP. Вам нужно будет явно указать учетные данные при подключении к удаленному серверу.

...