System.Net.WebClient не работает с Windows Authentication

Я пытаюсь использовать 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 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?

Ответ 1

Я видел аналогичную проблему, когда защита Integrated/NTLM будет работать только в том случае, если вы получаете доступ к узлу по имени компьютера или localhost. На самом деле, это [плохой] документ в Windows, который предназначен для защиты от "отражений".

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

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

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

Ответ 2

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

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 настроен неправильно. Попробуйте заменить "Negotiate" на "Basic" в приведенном выше и проверить конфигурацию IIS для веб-сайта. Там также куча возможных причин здесь.

Ответ 3

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

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

Ответ 4

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

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