Заголовок заголовка прошивки HTTP-прокси требует кукурузы

61
5

Я пытаюсь использовать REST API из-за веб-прокси в моем приложении С#, для которого требуется базовая аутентификация.

Я проверил свои учетные данные, используя приложение Postman chrome, и проверил, что они работают. Однако, когда я запускаю свое приложение С#, я получаю неавторизованный ответ 401.

Посмотрев на некоторые следы запросов Postman и используя http://httpbin.org с моим приложением С#, я думаю, что происходит, что веб-прокси-сервер, за которым я работаю, не перенаправляет заголовок авторизации, потому что мой запрос отсутствует cookie, который (я думаю) настраивается более умными веб-клиентами (например, Postman, который построен поверх Chrome). Я вижу в трассе сети Postman, что он отправляет куки файл, который похож на его прокси-сервер.

Я не знаю, как это сделать в моем приложении С#, поскольку я использую довольно высокоуровневые API. Любая помощь будет оценена по достоинству:

Обновить:

Я смог заставить его работать, скопировав файл cookie, который я увидел в трассировке, и добавив его в свой запрос (вставив его в CookieStore). Тем не менее, я не уверен, как я могу сделать это автоматически. Chrome должен каким-то образом получить это значение cookie и сохранить его. Есть ли способ заставить мое приложение сделать то же самое?

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

HttpClientHandler handler = new HttpClientHandler()
{
UseCookies = true,
CookieContainer = new System.Net.CookieContainer()
};
HttpClient client = new HttpClient(handler);

var byteArray = Encoding.UTF8.GetBytes(USER + ":" + PASS);
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Basic",
Convert.ToBase64String(byteArray));

var content = new FormUrlEncodedContent(new Dictionary<string, string> {
{ "field1", "value1" },
{ "field2", "value2" }
});

Console.WriteLine("Sending request");

var response = await client.PostAsync(HTTP_URL, content);
var responseString = await response.Content.ReadAsStringAsync();

Console.WriteLine("Server response (" + response.StatusCode + "):\n" + responseString);

спросил(а) 2021-01-19T13:07:21+03:00 2 месяца, 3 недели назад
1
Решение
75

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

В качестве побочного примечания, если вы не возражаете против небольшой зависимости от библиотеки, Flurl [отказ от ответственности: я автор] значительно упростит ваш код:

var client = new FlurlClient().EnableCookies();

var response = await HTTP_URL
.WithClient(client)
.WithBasicAuth(USER, PASS)
.PostUrlEncodedAsync(new {
field1 = "value1",
field2 = "value2",
});

ответил(а) 2021-01-19T13:07:21+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема