407 Требуется аутентификация - вызов не отправлен

Обновление:
Если вы только что подошли к этому вопросу, суть в том, что я пытаюсь сделать HttpWebRequest через прокси, и я получаю 407 от нашего странного прокси-сервер. IE, Firefox, Chrome успешно согласовывают прокси-сервер, как и приложения Adobe Air. Может быть важно, что веб-установщик Google Chrome действительно не работает, и нам приходится использовать автономный установщик.

Благодаря ссылке Яна я перешел на следующий этап. Теперь он отправляет токен обратно на прокси-сервер, однако 3-й этап не проходит, поэтому запрос с хешем имени пользователя/пароля не отправляется .NET и, следовательно, не возвращается HTML.

Я использую:

  • пользовательский агент IE6
  • Windows 7
  • Прокси-сервер Scansafe
  • .NET 3.5

Вот последний код, который соответствует приведенным ниже журналам:

HttpWebRequest request = HttpWebRequest.Create("http://www.yahoo.com") as HttpWebRequest;
IWebProxy proxy = request.Proxy;
// Print the Proxy Url to the console.
if (proxy != null)
{
    // Use the default credentials of the logged on user.
    proxy.Credentials = CredentialCache.DefaultCredentials;
}
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
request.Accept = "*/*";

HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream stream = response.GetResponseStream();

Исключение

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

Используемый прокси

Прокси-клиент — это аппаратное устройство Scansafe в нашей серверной комнате, которое (после аутентификации с помощью NTLM) затем направляет ваш HTTP-трафик на свои серверы для фильтрации трафика.

Выходные данные трассировки System.Net

IE успешно согласовывает прокси

Решение

На самом деле я не нашел решения, но благодаря Feroze и Eric я нашел обходной путь и обнаружил, что основной проблемой является фактический прокси (а не его конфигурация). Это может быть неясная проблема с 3 переменными: реализация .NET HttpWebRequest, Windows 7 и, конечно же, аппаратный клиент Scansafe, который находится в нашей стойке; но без запроса поддержки MSDN я не узнаю.


person Community    schedule 18.09.2009    source источник


Ответы (8)


Если вы хотите установить учетные данные для прокси, не должны ли вы устанавливать учетные данные для объекта request.Proxy, а не для объекта запроса?

http://msdn.microsoft.com/en-us/library/system.net.webproxy.credentials.aspx

Кроме того, имейте в виду, что для успешного использования проверки подлинности NTLM/Negotiate необходимо выполнить запрос HTTP/1.1 (или, технически, любой запрос с Keep-Alive).

(Инспектор «Аутентификация» Fiddler разложит для вас BLOB-объекты аутентификации NTLM, если вы еще не взглянули на это.)

person EricLaw    schedule 22.09.2009
comment
Учетные данные прокси-сервера устанавливаются, у меня такое чувство, что вторая часть аутентификации - это когда данные NTLM не возвращаются, а в pastebin.com/m52afe453 похоже, что клиент .NET даже не возвращает их, несмотря на то, что он получил второй ответ 407. - person Chris S; 22.09.2009
comment
Кстати, запрос HTTP 1.1 - HttpWebRequest#39785641 - Request: GET http://www.yahoo.com/ HTTP/1.1 - person Chris S; 22.09.2009
comment
Запрос — HTTP/1.1, но интересно, что в ответе указано, что следует использовать семантику HTTP/1.0. - person EricLaw; 23.09.2009
comment
Интересно, что прокси-сервер не возвращает заголовок ответа HTTP Proxy-Support: Session-Based-Authentication. Этот заголовок абсолютно необходим для использования NTLM/Negotiate для WWW-аутентификации, и я не сильно удивлюсь, узнав, что .NET требует его для прокси-аутентификации. Это должно быть довольно просто проверить с помощью Fiddler... - person EricLaw; 23.09.2009
comment
Мое решение состояло в том, чтобы загрузить CC Proxy и перейти через него к прокси-серверу, что устраняет проблему. IE отправляет обратно правильные заголовки, которые я не могу понять, как и CC Proxy. Я обновил пост, чтобы вы могли видеть, что он отправляет обратно. Будет ли причина, по которой он не будет отправлять правильные заголовки обратно одному клиенту, а правильные - другому? - person Chris S; 23.09.2009
comment
Комментарии Feroze ниже указывают на то, что токен NTLM отправляется неправильно. - person Chris S; 23.09.2009
comment
Если вы на самом деле публикуете файл .SAZ из Fiddler или просто используете вкладку Auth, вы можете увидеть разложенные NTLM Blobs и увидеть, что отличается между случаем IE и вашим приложением. Строка № 192 кажется ключевой в вашем журнале System.NET. Код вызывает InitializeSecurityContext с флагом Delegate, но пакет NTLM на самом деле не поддерживает ISC_REQ_DELEGATE, поэтому ISC возвращает SEC_E_UNSUPPORTED_FUNCTION. - person EricLaw; 23.09.2009
comment
Смотрите мой комментарий ниже, вам нужно развернуть список комментариев, чтобы увидеть его. Как я уже говорил, это может быть связано с обновлениями безопасности в Vista. Для дальнейшего расследования нам потребуется журнал NTLM с вашего клиентского компьютера, на котором произошел сбой, а также журнал NTLM об успешном случае с IE. Это может помочь нам отладить это дальше. - person feroze; 23.09.2009
comment
Я также вижу небольшую разницу в выводе скрипача по сравнению с журналом .NET. IE, похоже, отправляет файл cookie в запросе GET. Может ли это иметь какое-то отношение к этому? Может быть, прокси требует этот файл cookie? - person feroze; 23.09.2009
comment
Эрик, я заметил, что флаг делегата был передан в ISC. Однако обратите внимание, что когда ISC впервые вызывался с флагом делегата, он работал нормально и возвращал токен авторизации для отправки на сервер. Просто ему не нравится токен авторизации, отправленный обратно сервером. - person feroze; 24.09.2009
comment
Крис, можно ли попробовать сценарий .NET с другим именем пользователя/паролем, который поддерживает прокси? - person feroze; 24.09.2009
comment
Я получу журналы (скрипач и NTLM) завтра. Файл cookie только что был из предыдущего посещения IE, я должен был сначала очистить кеш. - person Chris S; 25.09.2009
comment
Крис, можешь еще раз уточнить про ОС? И клиент, и сервер работают под Win7? Также под Win7 вы подразумеваете Windows Server 2008R2 для сервера (и клиента) или вы на самом деле имеете в виду Windows7, то есть одну из многих разновидностей клиента Win7? - person feroze; 25.09.2009
comment
(Комментарии здесь - настоящий ответ) - person Chris S; 27.09.2009
comment
Угадайте, что у меня тоже была эта проблема - у меня нет решения, но у меня есть немного больше информации. Код выглядит нормально, и я не думаю, что NTLM чувствителен к шаблону кода. Однако я обнаружил, что тот же код, который дает сбой в Vista/Win7/2008/ при сборке с VS2008 для .NET35, будет работать при компиляции с VS2010 для .NET4. Эта проблема, по-видимому, затрагивает только Vista/Win7/2008, код .NET 35 и .NET 4 отлично работает на XP/2003. - person user28584; 08.09.2010

Я написал утилиту для декодирования больших двоичных объектов NTLM, отправленных в сеансах IE и HttpWebRequest.

Когда я смотрю на HttpWebRequest и IE, они оба запрашивают 56-битное и 128-битное шифрование с сервера. Вот дамп сеанса с использованием HttpWebRequest

==== Type1 ----
Signature: NTLMSSP
Type: 1
Flags: E20882B7
NTLMSSP_NEGOTIATE_56
NTLMSSP_NEGOTIATE_KEY_EXCH
NTLMSSP_NEGOTIATE_128
RESERVED2
RESERVED3
RESERVED4
NTLMSSP_REQUEST_NON_NT_SESSION_KEY
NTLMSSP_TARGET_TYPE_DOMAIN
NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
NTLMSSP_NEGOTIATE_DATAGRAM
NTLMSSP_REQUEST_TARGET
NTLM_NEGOTIATE_OEM
NTLMSSP_NEGOTIATE_UNICODE)
Domain :
Workstation:
==== Type2 ----
Signature: NTLMSSP
Type: 2
Flags: 201
NTLMSSP_NEGOTIATE_56
NTLMSSP_REQUEST_NON_NT_SESSION_KEY)
Context: D32FDDCB:63507CFA

Вот дамп из IE:

==== Type1 ----
Signature: NTLMSSP
Type: 1
Flags: A208B207
NTLMSSP_NEGOTIATE_56
NTLMSSP_NEGOTIATE_KEY_EXCH
NTLMSSP_NEGOTIATE_128
NTLMSSP_REQUEST_NON_NT_SESSION_KEY
NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITY
NTLMSSP_TARGET_TYPE_SHARE
NTLMSSP_TARGET_TYPE_DOMAIN
NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED
NTLMSSP_NEGOTIATE_DATAGRAM
NTLMSSP_REQUEST_TARGET
NTLMSSP_NEGOTIATE_UNICODE)
Domain : XXXX.UK
Workstation: XXX-X31
==== Type2 ----
Signature: NTLMSSP
Type: 2
Flags: 201
NTLMSSP_NEGOTIATE_56
NTLMSSP_REQUEST_NON_NT_SESSION_KEY)
Context: D32FDDCB:63507CFA

В обоих IE/HttpWebRequest они запрашивают как 64-битную, так и 128-битную безопасность. Однако для Windows7 128-битная безопасность для NTLM была сделана по умолчанию, и без этого аутентификация не удастся. Как видно из ответа сервера, сервер поддерживает только 64-битное шифрование.

По следующей ссылке есть обсуждение аналогичной проблемы, с которой столкнулся другой человек. http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/f68e8878-53e9-4208-b589-9dbedf851198

Причина, по которой IE работает вместо управляемого приложения, заключается в том, что IE на самом деле не запрашивает NTLMSSP_NEGOTIATE_SEAL | NTLMSSP_NEGOTIATE_SIGN, которые требуют шифрования. Однако HttpWebRequest запрашивает как SEAL|SIGN. Для этого требуется 128-битное шифрование, тогда как способ, которым IE инициализирует NTLMSSP (без SEAL и SIGN), не требует шифрования. Следовательно, IE работает, а HttpWebRequest — нет. (см ссылку выше)

Я думаю, что если вы измените свою политику безопасности, разрешив 64-битное шифрование для NTLM, ваше приложение с управляемым кодом будет работать. Или попросите поставщика прокси поддерживать 128-битное шифрование для NTLM.

Надеюсь это поможет.

person Community    schedule 26.09.2009
comment
К сожалению, я не могу изменить политику безопасности, поскольку она распространяется на весь домен примерно для 600 человек. Спасибо за время, которое вы потратили на раскапывание информации, хотя - person Chris S; 27.09.2009

У меня была похожая проблема, и я использовал советы в следующем сообщении в блоге, чтобы решить проблему:

http://blogs.msdn.com/jpsanders/archive/2009/03/24/httpwebrequest-webexcepton-the-remote-server-returned-an-error-407-proxy-authentication-required.aspx

person Ian Kemp    schedule 18.09.2009
comment
Спасибо за ссылку. Теперь он переходит к запросу/ответу 2, как указано выше, и получает ошибку 407. - person Chris S; 18.09.2009
comment
Можете ли вы получить журнал system.net и вставить его сюда? Вот инструкции: ferozedaud.blogspot.com/2009/08/tracing -with-systemnet.html - person feroze; 20.09.2009
comment
Хорошо, я посмотрел файл журнала System.Net, который вы приложили. Похоже, что существует несовместимость между возможностями аутентификации/безопасности клиентского компьютера и прокси-сервера. Не подскажете какая ОС на клиенте и ОС на прокси? Кроме того, какой прокси-сервер вы используете? - person feroze; 21.09.2009
comment
Кроме того, можете ли вы сжать свой код до простого компилируемого консольного приложения из одного файла, которое демонстрирует проблему? Я думаю, у меня может быть идея, почему это не работает для вас, но сначала мне нужно увидеть код. Кроме того, как упоминалось ранее, мне нужно знать ОС, которые вы используете на клиенте и прокси-сервере, а также программное обеспечение прокси-сервера. - person feroze; 21.09.2009
comment
Прокси-сервер — это безопасный для сканирования клиент (и сервер), а Windows 7 - person Chris S; 22.09.2009
comment
Глядя на журнал system.net, я вижу, что пакету NTLM на клиенте не нравится токен авторизации, отправленный сервером. Погуглив, я нашел несколько ссылок, которые могут помочь понять это: technet.microsoft.com/en-us/library/dd566199(WS.10).aspx и social.msdn.microsoft.com/Forums/en-US/ncl/thread/ Если вы хотите продолжить отладку, вам нужно будет включить ведение журнала NTLM ETL, используя инструкции, подобные этой: blogs.msdn.com/ntdebugging/archive/2009/09/08/ - person feroze; 22.09.2009
comment
Или, в качестве альтернативы, вы можете опубликовать свой вопрос в группах новостей Microsoft NCL (social.msdn.microsoft.com/forums/en-us/ncl), и некоторые разработчики NCL могут вам помочь. Или вы можете открыть обращение в службу поддержки с помощью Microsoft PSS. - person feroze; 22.09.2009
comment
Если вы хотите получить журнал NTLM, я могу посмотреть и посмотреть, смогу ли я понять, что происходит. В противном случае вы можете следить за собой с помощью группы новостей NCL или Microsoft PSS. Удачи! - person feroze; 22.09.2009
comment
Windows 7 Ultimate. Прокси является безопасным для сканирования, аппаратным устройством. В моей установке Windows 7 не было узла inet в дереве средства просмотра событий, поэтому я не могу получить журналы ntlm. В журналах Fiddler было очень мало информации на вкладке авторизации, о которой говорил Эрик. Я все еще немного смущен тем, почему у некоторых приложений (которые не используют оболочку .NET вокруг wininet) нет никаких проблем, но это, вероятно, теперь проникает в сферу поддержки MSDN вместо использования SO . - person Chris S; 26.09.2009
comment
Когда вы говорите, что IE может войти в систему, вы явно указываете свое имя пользователя/пароль/домен в IE, или IE выбирает учетные данные вошедшего в систему пользователя? Когда я смотрю на разницу запросов NTLM между сеансами IE и HttpWebRequest, я вижу, что IE отправляет информацию о домене (XXXX.UK) и WorkstationInfo, а Httpwebrequest — нет. Можете ли вы попробовать установить явные учетные данные на прокси-сервере и посмотреть, сработает ли это? - person feroze; 27.09.2009

Проверьте следующую настройку в secpol.msc. Это решило нашу проблему.

Local Security Policy 
    Local Policies
        Security Options
            Network security: Minimum session security

Установлен в:

require 128 only for client. 

введите здесь описание изображения

person Community    schedule 05.03.2013

Можете ли вы попробовать установить заголовок User-Agent в вашем HttpWebRequest на то же значение, что и IE8?

Иногда серверы не будут правильно запрашивать, если пользовательский агент не соответствует их ожиданиям.

надеюсь это поможет.

person Community    schedule 19.09.2009
comment
То же самое происходит независимо от пользовательского агента - person Chris S; 21.09.2009

Это способ назначения прокси?

proxy.Credentials = CredentialCache.DefaultCredentials;

Когда я в последний раз использовал прокси с HttpWebRequest, он был назначен так:

Назначить прокси для запроса:

request.Proxy.Credentials = Credentials.GetProxyCredentials();

Способ вызова:

    public static ICredentials GetProxyCredentials()
    {
        return new NetworkCredential(AppConstants.Proxy_username, AppConstants.Proxy_password);
    }

Настроить прокси в web.config

<system.net>
  <defaultProxy enabled="true">
    <proxy
      autoDetect="False"
      bypassonlocal="True"
      scriptLocation="http://www.proxy.pac"
      proxyaddress="http://proxy1.blah.com" />
  </defaultProxy>
</system.net>
person CRice    schedule 25.09.2009
comment
Я пробовал все варианты всех возможных свойств с прокси и учетными данными :) Это определенно согласование NTLM. - person Chris S; 26.09.2009

Это может быть связано с тем, что находится в вашем «CredentialCache». Попробуйте это вместо этого:

proxy.Credentials = new NetworkCredential("username", "pwd", "domain"); 
person Shiraz Bhaiji    schedule 25.09.2009

Как насчет этого:

        HttpWebRequest request = HttpWebRequest.Create("http://www.yahoo.com") as HttpWebRequest;
        WebProxy proxyObject = new System.Net.WebProxy("http://10.0.0.1:8080/", true); //whatever your proxy address is

        proxyObject.Credentials = CredentialCache.DefaultCredentials;
        request.Proxy = proxyObject;

        request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
        request.Accept = "*/*";

        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        Stream stream = response.GetResponseStream();
person lod3n    schedule 25.09.2009