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 Dev.

Когда я пытаюсь открыть страницу в 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?

12 голосов | спросил Peter Hahndorf 23 J0000006Europe/Moscow 2009, 05:10:14

3 ответа


0

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

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

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

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

ответил Goyuix 18 J0000006Europe/Moscow 2010, 03:26:16
0

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

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

ответил JP Alioto 23 J0000006Europe/Moscow 2009, 05:14:32
0

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

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

ответил Ariel 23 J0000006Europe/Moscow 2009, 05:23:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132