Использование веб-службы через прокси-сервер в Интернете с использованием клиента WCF на C #; обеспечение аутентификации прокси-сервера

У меня есть клиентская программа, которая использует веб-службу. Он неплохо работает в ряде инсталляций. Теперь у меня возникла ситуация, когда новый клиент подключается к Интернету через прокси-сервер, и при попытке моей программы получить доступ к веб-службе возникает ошибка «HTTP-статус 407: требуется проверка подлинности прокси».

Я думал, что вся настройка доступа в Интернет, включая адрес прокси-сервера, номер порта и аутентификацию, будет выполняться в настройках Интернета панели управления, и что мне не придется беспокоиться об этом в коде или даже в приложении. config клиента веб-службы.

Я все неправильно понял?

Тем временем я дал пользователю возможность настроить имя пользователя и пароль прокси-сервера, а затем в своем коде я делаю следующее:

webServiceClient.ClientCredentials.UserName.UserName = configuredUsername;
webServiceClient.ClientCredentials.UserName.Password = configuredPassword;

Но я не знаю, правильно ли это. Мне кажется, что указанные выше ClientCredentials относятся к привязке / безопасности веб-службы, а не к прокси-серверу в Интернете.

Полагаю, я могу попробовать это у заказчика, но я лучше сначала буду уверен в том, что делаю.


person Peter    schedule 04.11.2009    source источник


Ответы (1)


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

Вот код, который в итоге сработал (замаскированный подходящим образом, но дает правильное представление):

    BasicHttpBinding binding = new BasicHttpBinding("APISoap"); /* APISoap is the name of the binding element in the app.config */
    binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
    binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic;
    binding.UseDefaultWebProxy = false;
    binding.ProxyAddress = new Uri(string.Format("http://{0}:{1}", proxyIpAddress, proxyPort)); 
    EndpointAddress endpoint = new EndpointAddress("http://www.examplewebservice/api.asmx");

    WebServiceClient client = new WebServiceClient(binding, endpoint);

    client.ClientCredentials.UserName.UserName = proxyUserName;
    client.ClientCredentials.UserName.Password = proxyPassword;
person Peter    schedule 06.11.2009
comment
Что делать, если веб-сервису требуются собственные учетные данные, знаете ли вы, как добавить их вместе с прокси-сервером? - person net_prog; 01.11.2013
comment
Это решение работает, когда службе и прокси-серверу требуются одни и те же учетные данные, но в случае, если для обоих требуются собственные учетные данные, то как установить учетные данные. Какие изменения необходимо внести в случае прокси-сервера с NTLM-аутентификацией? - person Ajay Bhasy; 12.03.2015
comment
@net_prog и ajay: Извините, я не могу ответить на этот вопрос, не проведя большого исследования. Мне удалось заставить мое решение работать еще 5 лет назад, и с тех пор я никогда больше не смотрел на подобные вещи. - person Peter; 12.03.2015
comment
Возможно, ответ на две разные аутентификации - использовать что-то вроде базового токена аутентификации в заголовке вашего запроса вместо непосредственного пользователя / прохода? - person th3morg; 15.03.2018