System.Net.WebClient не работает с проверкой подлинности Windows

StackOverflow https://stackoverflow.com/questions/1030177

  •  06-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь использовать 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.
  • Щелкните правой кнопкой мыши Имена хостов обратного подключения, а затем нажмите кнопку Изменить.
  • В поле Значение данных введите имя хоста или имена хостов для сайтов, которые находятся на локальном компьютере, а затем нажмите кнопку ОК.
  • Выйдите из редактора реестра, а затем перезагрузите компьютер.

http://support.microsoft.com/kb/956158/en-us

Другие советы

Вы пробовали ...

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 для этого каталога, в противном случае независимо от того, какой пул приложений учетной записи запущен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top