(407) Требуется аутентификация прокси

Я знаю, что об этом спрашивали много раз. Я прочитал почти все сообщения здесь и на других сайтах, подобных этому.

http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/2931d21c-9ca8-4256-b213-915fad4c941b/

Безрезультатно. Вот окружающая среда

Windows Server 2008 R2 64-разрядная версия Visual Studio 2008 .Net Framework 3.5

Вот что я пробовал

У меня была аутентификация прокси с использованием кода

WebRequest req = WebRequest.Create(requestUri + data);
req.Proxy = new System.Net.WebProxy(<ProxyURL>:<port>",true);
req.Proxy.Credentials = CredentialCache.DefaultCredentials;
WebResponse resp = req.GetResponse();

Это сработало, но, увидев, что приложение замедляет работу, я узнал, что могу отредактировать файл machine.config, что я и сделал. Это тоже сработало!

    <system.net>
      <defaultProxy
      useDefaultCredentials="true">
      <proxy
        proxyaddress="<proxyURL>:<port>"
        bypassonlocal="True"/>
     </defaultProxy>
   </system.net>

По крайней мере, на день или 2. Потом он начал глючить.

Затем я отредактировал его на это

    <system.net>
     <defaultProxy
       useDefaultCredentials="true">
       <proxy usesystemdefault="True"/>
       </defaultProxy>
    </system.net>

Насколько я понимаю, это будет использовать настройки IE для подключения к прокси, но все равно не работает. Я также пробовал код tihs

WebProxy proxy = new WebProxy(<proxy>:<port>);
CredentialCache myCache = new CredentialCache();
myCache.Add(new Uri(requestUri + data), "BASIC", new NetworkCredential(<username>,<password>));
proxy.Credentials = myCache;
request.Proxy = proxy;
request.Method = "GET";

И это не сработало.

Примечание. Я могу скопировать файл machine.config на свой компьютер (Win XP) и запустить оттуда .exe (без прокси-кода), и он отлично работает.

Есть ли что-то другое, что мне нужно сделать с 64-битной ОС? Также я могу открыть IE8 на сервере и получить доступ к URI. цель состоит в том, чтобы предварительно аутентифицировать прокси без указания имени пользователя и пароля в коде.


person jlh3302    schedule 29.03.2013    source источник
comment
Пароль не должен содержать спецсимволов... попробуй!!!   -  person    schedule 25.12.2013


Ответы (2)


HttpWebRequest в любом случае использует прокси-сервер настроек Интернета (IE) по умолчанию, поэтому, если он нормально работает из Internet Explorer на сервере, он также должен работать в вашем коде (при условии, что он работает под той же учетной записью пользователя).

Я бы вернул machine.config как было.

Одна вещь, которую я бы проверил в IIS, это то, что вы можете настроить Providers для апплета Windows Authentication. Это должно указать NTLM и Kerberos в качестве поставщиков в списке; Я бы поменял их местами и посмотрел, имеет ли это значение (например, если NTLM находится в верхней части списка, переместите Kerberos наверх). К сожалению, я не могу дать вам точные инструкции, так как у меня нет IIS на этой машине.

Если вы все еще боретесь, я бы порекомендовал вам запустить Fiddler на сервере, чтобы зафиксировать поток запросов и ответов для получения дополнительных подсказок.

person David Moore    schedule 30.03.2013
comment
Кажется, ничего не работает. Проверен IIS, проверка подлинности Windows использует Negotiate и NTLM, если это помогает - person jlh3302; 01.04.2013
comment
Код не требовался, он использовал настройки IE. Мой не работал, потому что я пытался использовать Fiddler, и он изменил настройки прокси-сервера IE. В Fiddler я выбираю «Правила/Автоматическая аутентификация», и мой код работает. Как только я закрыл Fiddler, я проверил настройки прокси-сервера IE, чтобы убедиться, что они изменились. Кажется, все еще работает. - person jlh3302; 03.04.2013

@ Дэвид Мур прав. если IE работает нормально, когда вы просматриваете вручную, просто добавьте req.Proxy.Credentials = CredentialCache.DefaultCredentials;, и он будет работать нормально.

Вот модифицированный код, взятый из MSDN, который у меня работает.

using System;
using System.Diagnostics;
using System.IO;
using System.Net;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            string urlDemo = "http://en.wikipedia.org/wiki/Main_Page";
            // Create a request for the URL. 
            WebRequest request = WebRequest.Create(urlDemo);
            // If required by the server, set the proxy credentials.
            request.Proxy.Credentials = CredentialCache.DefaultCredentials;
            // Get the response.
            WebResponse response = request.GetResponse();
            // Display the status.
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            // Get the stream containing content returned by the server.
            Stream dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd();
            // Display the content.
            Console.WriteLine(responseFromServer);
            Console.ReadLine();
            // Clean up the streams and the response.
            reader.Close();
            response.Close();

        }
    }
}

Надеюсь, поможет ;-)

person anagnam    schedule 17.11.2014
comment
Хм, этот код работает как с WebRequest.Proxy, так и без него. Поэтому я не уверен, что демонстрируется. - person Tom Wilson; 14.04.2015
comment
Я получал ошибку 407 там, где я действительно не должен был ее получать (по крайней мере, я так думал), но затем я добавил строку req.Proxy.Credentials = CredentialCache.DefaultCredentials, как вы предложили, и Бинго! Это исправило это. - person Cyberherbalist; 02.02.2016