У меня есть веб-служба ASMX (на моем локальном хосте - WinXP IIS 5.1), которую я вызываю из веб-клиента. Моя веб-служба должна использовать другую веб-службу ASMX (на сервере Win 2003 IIS 6.0).
Когда я предоставляю учетные данные в коде своего веб-сервиса "жестко запрограммированным" способом:
engineWSE.Credentials = new System.Net.NetworkCredential("myUser", "myPass", "myDomain");
... последующий вызов удаленной веб-службы работает нормально.
Теперь я пытаюсь выдать себя за себя на начальном этапе тестирования. Мое начальное чтение по этому поводу говорит мне, что это может быть серьезная тема, но вот что я сделал для начала:
НЕ ПРОВЕРЕН "Анонимный доступ" в моем виртуальном каталоге для сайта WebClient на моем локальном хосте
в web.config моего сайта веб-клиента я установил: authentication mode = "Windows" и identity impersonate = "true"
в веб-методе моего веб-сервиса, который должен вызывать удаленный сервис, я изменил его на:
engineWSE.Credentials = System.Net.CredentialCache.DefaultCredentials;
Когда удаленный веб-сервис вызывается с этими 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 аргументами (то есть именем пользователя, паролем, доменом).
Ответ 1 · рейтинг 3 · bkqc
Как сказал @Michael Levy, это проблема с двойным прыжком. Это означает, что если вы не настроите Kerberos (Negotiate), NTLM, вероятно, будет использоваться в среде Windows под управлением IIS, имея клиента с браузером на машине A, пытающейся получить доступ к веб-сайту на машине B, будет иметь доступ к сайту, НО, когда это сайт попытается связаться со службой на компьютере C, вместо этого следует использовать учетные данные пула.
То же самое верно и для веб-сайта A, вызывающего службу B, которая, в свою очередь, вызывает службу C.
При настройке Kerberos для веб-сайтов следует учитывать несколько вещей. Во-первых, нужно знать, ферма это или нет. Если это так, вы должны определить общего пользователя для пула для всех машин, входящих в ферму. Это необходимо, поскольку Kerberos использует доменное имя для идентификации принципала, используемого для шифрования токенов безопасности. Если у вас были разные пользователи на разных машинах одной фермы, поскольку все они будут доступны через одно и то же доменное имя, все запросы будут искать та же запись. Более подробную информацию можно найти здесь: Kerberos и балансировка нагрузки.
Например, предположим, что у вас есть сайт с myApp.intranet в качестве URL-адреса. В AD у вас будет SPN, установленный, например, на myUser в домене MyDomain (setspn -S MyDomain \ myUser HTTP / myapp.intranet). Когда запрос отправляется в KDN (см. Ссылки на kerberos в конце для получения дополнительной информации о KDN), он всегда будет возвращать токен, зашифрованный с помощью myUser, но IIS попытается расшифровать его с помощью разных пользователей. Может возникнуть соблазн создать несколько SPN для одной и той же службы (HTTP / myapp.intranet), но это приведет к ошибке KRB.
Кроме того, если вы используете IIS 7+, вам нужно будет указать небольшую деталь в своем ApplicationHost.config, если вы хотите оставить аутентификацию в режиме ядра включенной (что настоятельно рекомендуется): useAppPoolCredentials = true. Это значение должно быть установлено в конфигурации \ system.webServer \ security \ authentication \ windowsAuthentication. Это потому, что по умолчанию Проверка подлинности в режиме ядра будет использовать учетную запись компьютера, а не учетную запись пула, и это вернет нас к многопользовательскому сценарию.
Во всех случаях Доверяйте этому пользователю для .. . на вкладке "Делегирование" участника AD необходимо включить, чтобы делегирование работало. Затем вам нужно решить, хотите ли вы использовать общее или ограниченное делегирование.
Как я сказал ранее, вам также необходимо установить SPN для нужного пользователя и нужной службы. Пользователя довольно легко идентифицировать, так как это будет тот, который вы определили в своем пуле, но служба может быть немного сложной в зависимости от вашей конфигурации. DNS, браузер и, возможно, другие переменные могут изменить то, что следует использовать. Наши испытания и ошибки показали следующее:
- Если ваша запись DNS является записью A, вы используете ее напрямую
- Если ваша запись является CName, в наших тестах использовалась запись A, связанная с ней.
- У нас были случаи, когда использовалось CName, и казалось, что это связано с версией браузера.
Обратите внимание: если имя участника-службы не задано специально и вы заходите на свой веб-сайт через имя NetBIOS, будет запрошена служба HTTP / машины, и что по умолчанию Служба HOST (поиск дополнительных) может использоваться вместо HTTP, чтобы HOST / машина использоваться. Это может быть полезно для легкой настройки в небольшой сети.
Также следует иметь в виду, что если вы хотите ограничить время простоя при переходе с NTLM на Kerberos, вы должны сначала изменить ApplicationHost, а затем использовать SetSPN. Вы также можете отключить согласование перед любым действием и оставить только NTLM, пока все не будет настроено, а затем, если возможно, включить только согласование (без NTLM). Это должно заставить клиентов изменить способ доступа к вашему сайту. Если вы этого не сделаете, похоже, что механизм кеширования на какое-то время будет работать с NTLM.
Надеюсь, это поможет. Если у вас все еще есть проблема с настройкой Kerberos, WireShark станет вашим самым верным другом. Вы можете найти информацию о том, как отлаживать Kerberos на следующих страницах: - Отладка Kerberos для веб-сайта - Отладка проблем AD с Kerberos (один из них - максимальный размер токена) - Инструменты Kerberos и другие ссылки - Отладка Kerberos общего захвата сети