System.Net.WebClient не работает с проверкой подлинности Windows - PullRequest
12 голосов
/ 23 июня 2009

Я пытаюсь использовать 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» в параметрах Internet Explorer.

Журнал событий безопасности имеет аудит сбоев:

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?

Ответы [ 4 ]

19 голосов
/ 18 июня 2010

Я видел аналогичную проблему, когда встроенная безопасность / NTLM будет работать, только если вы обращаетесь к хосту по имени машины или локальному хосту. Фактически, это [плохо] функция документа в Windows, предназначенная для защиты от «отраженных атак».

По сути, вам нужно создать раздел реестра на компьютере, который пытается получить доступ к серверу, и внести в белый список домен, на который вы пытаетесь попасть. Каждое имя хоста / полное доменное имя должно быть в отдельной строке - подстановочные знаки отсутствуют, и имя должно точно совпадать. Из статьи КБ:

  • Нажмите Пуск, нажмите Выполнить, введите regedit и нажмите кнопку ОК.
  • В редакторе реестра найдите и щелкните следующий раздел реестра: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ LSA \ MSV1_0
  • Щелкните правой кнопкой мыши MSV1_0 , выберите пункт Новый, а затем нажмите Значение из нескольких строк.
  • Введите BackConnectionHostNames и нажмите клавишу ВВОД.
  • Щелкните правой кнопкой мыши BackConnectionHostNames и выберите команду Изменить.
  • В поле «Значение» введите имя хоста или имена хостов для сайтов, находящихся на локальном компьютере, и нажмите кнопку ОК.
  • Закройте редактор реестра и перезагрузите компьютер.

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

4 голосов
/ 23 июня 2009

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

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 для веб-сайта. Есть также куча возможных причин здесь .

1 голос
/ 23 июня 2009

Попробуйте зайти в настройки IE и явно добавить сайт в зону интрасети. Затем перезапустите программу. Вы также не должны запускать программу от имени администратора. Это может вызвать настройку расширенной безопасности для Internet Explorer .

Это может объяснить, почему вы можете попасть на сайт с помощью Firefox и Opera, но не с помощью IE или WebClient.

0 голосов
/ 23 июня 2009

Не зная вашего развертывания IIS и предполагая, что у вас есть правильные правила авторизации для загрузки, установленные в IIS (например, правильные разрешения * ACL на правильных папках, в которые вы пытаетесь загрузить контент и т. Д.), Первое, что я бы попробовал установить для UseDefaultCredentials значение true вместо явно установленного Credential. (Может быть, вы думаете, что обращаетесь к серверу с учетными данными, которые вы устанавливаете, но это не так? Это было бы возможно, если бы это работало.)

Это очень распространенный сценарий, поэтому я бы сосредоточился на правилах авторизации IIS для каталога, в который вы пытаетесь загрузить файл, на реальных ACL-списках в этом каталоге. Например Ваш сайт олицетворяет или нет? если это так, то у вас должны быть действительные списки ACL для этого каталога, в противном случае независимо от того, какой пул приложений учетной записи запущен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...