System.Net.WebClient не работает с проверкой подлинности Windows
Вопрос
Я пытаюсь использовать System.Net.WebClient в приложении WinForms для загрузки файла на сервер IIS6, который имеет аутентификацию Windows в качестве это только метод "Аутентификации".
WebClient myWebClient = new WebClient();
myWebClient.Credentials = new System.Net.NetworkCredential(@"boxname\peter", "mypassword");
byte[] responseArray = myWebClient.UploadFile("http://localhost/upload.aspx", fileName);
Я получаю сообщение "Удаленный сервер вернул сообщение об ошибке:(401) Несанкционированный", на самом деле это 401.2
И клиент, и IIS находятся на одном компьютере разработчиков Windows Server 2003.
Когда я пытаюсь открыть страницу в Firefox и ввести те же правильные учетные данные, что и в коде, появляется страница.Однако при использовании IE8 я получаю ту же ошибку 401.2.
Попробовал Chrome и Opera, и они оба работают.
У меня включена опция "Включить встроенную проверку подлинности Windows" в параметрах Интернета IE.
В журнале событий безопасности есть аудит сбоев:
Logon Failure:
Reason: An error occurred during logon
User Name: peter
Domain: boxname
Logon Type: 3
Logon Process: ÈùÄ
Authentication Package: NTLM
Workstation Name: boxname
Status code: 0xC000006D
Substatus code: 0x0
Caller User Name: -
Caller Domain: -
Caller Logon ID: -
Caller Process ID: -
Transited Services: -
Source Network Address: 127.0.0.1
Source Port: 1476
Я использовал Process Monitor и Fiddler для расследования, но безрезультатно.
Почему это должно работать для сторонних браузеров, но не с IE или System.Net.WebClient?
Решение
Я видел аналогичную проблему, когда интегрированная защита / NTLM будет работать только в том случае, если вы обращаетесь к хосту по имени компьютера или localhost.Фактически, это [плохая] функция документирования в Windows, которая предназначена для защиты от "атак отражения".
По сути, вам нужно создать раздел реестра на компьютере, который пытается получить доступ к серверу, и внести домен, к которому вы пытаетесь подключиться, в белый список.Каждое имя хоста / ПОЛНОЕ доменное имя должно быть в отдельной строке - подстановочных знаков нет, и имя должно точно совпадать.Из статьи KB:
- Нажмите кнопку Пуск, нажмите кнопку Выполнить, введите regedit и затем нажмите кнопку ОК.
- В редакторе реестра найдите и затем щелкните следующий раздел реестра:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
- Щелкните правой кнопкой мыши MSV1_0, наведите указатель мыши на Создать, а затем щелкните Многострочное значение.
- Тип Имена хостов обратного подключения, а затем нажмите ENTER.
- Щелкните правой кнопкой мыши Имена хостов обратного подключения, а затем нажмите кнопку Изменить.
- В поле Значение данных введите имя хоста или имена хостов для сайтов, которые находятся на локальном компьютере, а затем нажмите кнопку ОК.
- Выйдите из редактора реестра, а затем перезагрузите компьютер.
Другие советы
Вы пробовали ...
new NetworkCredential( "peter", "password", "boxname" );
Вы также можете попробовать ...
var credCache = new CredentialCache();
credCache.Add( new Uri ("http://localhost/upload.aspx"),
"Negotiate",
new NetworkCredential("peter", "password", "boxname"));
wc.Credentials = credCache;
Кроме того, согласно этому может быть, что IIS настроен неправильно. Попробуйте заменить " вести переговоры " с " Базовым " в вышеупомянутом и проверении своего конфигурации IIS для веб-сайта. Есть также множество возможных причин "nofollow noreferrer"> здесь .
Попробуйте перейти к настройкам IE и явно добавить сайт в зону интрасети. Затем перезапустите программу. Вы также не должны запускать программу от имени администратора. Это может вызвать конфигурацию усиленной безопасности для Internet Explorer .
Это может объяснить, почему вы можете попасть на сайт с помощью Firefox и Opera, но не с помощью IE или WebClient.
Не зная вашего развертывания IIS, и предполагая, что у вас есть правильные правила авторизации для загрузки, установленные в IIS (например, правильные разрешения * ACL на правильных папках, в которые вы пытаетесь загрузить контент, и т. д.), первое, что я бы попробовал установить для UseDefaultCredentials значение true вместо явно установленного Credential. (Может быть, вы думаете, что обращаетесь к серверу с учетными данными, которые вы устанавливаете, но это не так? Это было бы возможно, если бы это работало.)
Это очень распространенный сценарий, поэтому я бы сосредоточился на правилах авторизации IIS для каталога, в который вы пытаетесь загрузить файл, на реальных ACL-списках этого каталога. Например Ваш сайт олицетворяет или нет? если это так, то у вас должны быть действительные списки ACL для этого каталога, в противном случае независимо от того, какой пул приложений учетной записи запущен.