Хобрук: Ваш путь к мастерству в программировании

Как аутентифицировать веб-сервис .NET2 с помощью прокси-сервера SQUID

У меня есть небольшая утилита, которая является клиентом SOAP WebService. SOAP-прокси генерируется из WSDL. Он работал нормально.

Теперь клиент хочет использовать прокси-сервер SQUID, но он отказывается аутентифицировать мой клиент SOAP.

Я уже пробовал:

 MyWebservice ws = new MyWebservice();
 // set URL etc.
 // login for the actual service, this part works
 HeaderLogin hl = new HeaderLogin();
 hl.username = svcLogin;
 hl.password = svcPassword;
 ws.HeaderLoginValue = hl;

 // setting up the Proxy of the Proxy
 //ws.Proxy = System.Net.WebRequest.GetSystemWebProxy();
 ws.Proxy = System.Net.WebRequest.DefaultWebProxy;

 //ws.Proxy.Credentials = CredentialCache.DefaultCredentials;                
 ws.Proxy.Credentials = new NetworkCredential(proxyUser, proxyPassword, proxyDomain);

Но я продолжаю получать ошибку HTTP 407: требуется проверка подлинности прокси.

SQUID (squid/2.7.STABLE4) настроен на использование NTLM и AD для аутентификации. Кажется, это работает нормально: есть другие клиенты WebService, которые проходят через прокси-сервер.

У меня нет прямого доступа к сайту, но я могу просмотреть только некоторые лог-файлы. Самое замечательное то, что я вижу в файлах PCAP (Wireshark). Когда я создаю NetworkCredential с userName="Henk", domain="TEST", он отображается в PCAP как

... HTTP CONNECT someurl:443 HTTP/1.1 , NTLMSSP_AUTH, Пользователь: T\H

И когда я смотрю на PCAP для рабочего сервиса

... HTTP CONNECT someurl: 443 HTTP/1.0, NTLMSSP_AUTH, пользователь: TEST\Henk

А в журнале SQUID access.log все попытки отображаются так:

... 0 192.168.15.95 TCP_DENIED/407 1759 ПОДКЛЮЧИТЬ someurl:443 - НЕТ/- text/html
... 32 192.168.15.95 TCP_DENIED/407 2055 ПОДКЛЮЧИТЬ someurl:443 - NONE/- text/html
... 31 192.168.15.95 TCP_DENIED/407 1759 CONNECT someurl:443 - NONE/- text/html

Конкретные вопросы:

  • какие-либо известные проблемы с .NET2 SOAP и Squid?
  • имеет значение отображение TEST\Henk как T\H?
  • что-нибудь еще я должен искать?

  • Случайная вещь для проверки: откуда берутся proxyUser, proxyPassword и proxyDomain? Возможно ли, что они случайно ошиблись, прежде чем достигли этой точки? proxyUser = form.Fields["proxyUser"][0] вместо proxyUser = form.Fields["proxyUser"] может быть? 22.07.2010
  • @Stobor: Хороший вопрос, но я бы назвал это «систематическим», а не «случайным». Все проверено и перепроверено. 22.07.2010
  • @Хенк, ты когда-нибудь решал эту проблему? Я сталкиваюсь с той же проблемой, используя WebClient, который отказывается аутентифицироваться с помощью прокси-сервера Squid, несмотря на то, что все браузеры аутентифицируются с помощью прокси-сервера, и WebClient работает, если я отключу аутентификацию. 28.02.2014
  • @RobLevine - извините за запоздалую реакцию. Нет, у меня так и не заработало, установка была изменена. 17.03.2014

Ответы:


1

Возможно, соединение NTLM перезапускается до того, как соединение будет завершено, что приведет к новому/второму запросу анонимного соединения и ошибке 407.

Попробуйте переопределить метод GetWebRequest(Uri uri) и установить KeepAlive в false.

Отредактируйте файл Reference.cs следующим образом:

protected override WebRequest GetWebRequest(Uri uri)
{
   HttpWebRequest webRequest = (HttpWebRequest)base.GetWebRequest(uri);
   webRequest.KeepAlive = false;
   return webRequest;
}

Просто помните, что обновление веб-ссылки приведет к тому, что Visual Studio повторно создаст файл, и вам нужно будет снова изменить файл.

22.07.2010
  • Я не смогу проверить это до следующей недели, но думаю, что это не проблема, я вижу в журналах, что другие (рабочие) клиенты также используют KeepAlive=true. 23.07.2010

  • 2

    T\H может указывать на то, что у вас есть строка Unicode, используемая в качестве строки ASCII. Поскольку символы Unicode состоят из двух байтов (наиболее распространенный случай в Windows), если вы интерпретируете их как ASCII, вы получите реальный символ и нулевой терминатор.

    Я не ожидал увидеть такую ​​ошибку в приложении .NET, но кто знает.

    19.07.2010
  • Я попробую завтра, но я думаю, что в заголовках есть флаг, который называется UnicodeNegotiate. T\H может исходить и от WireShark. 19.07.2010
  • Вы можете просмотреть необработанные байты в WireShark, который покажет вам, является ли это WireShark или просто отправителем данных. 21.07.2010
  • Мне нравится это предложение, ты проверял его, Хенк? 22.07.2010
  • настройка ASCII (на клиенте SOAP) не работала. В pcap видно, что полное имя, домен и пароль есть (всегда в UTF-16). Итак, я предполагаю, что односимвольная вещь от WireShark. 22.07.2010

  • 3

    Я вижу, что журнал squid показывает отказ в доступе к someurl:443... порт 443 является портом безопасного канала (SSL). В обычной практике веб-сервисы, размещенные на SSL, требуют некоторой аутентификации. проверьте требования к учетным данным веб-сервиса. возможно, вам придется передать учетные данные или аутентифицировать себя как действительного клиента с помощью сертификата.

    21.07.2010
  • аджай, ты прав, но у нас все это есть (и работает). Нас блокирует только прокси и ошибка 407. 22.07.2010
  • вы можете попробовать установить http_access, разрешающий домен в вашей конфигурации squid 22.07.2010

  • 4

    вы можете попробовать добавить «http_access allow» в домен в вашей конфигурации squid

    23.07.2010
    Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..