Что может привести к тому, что запросы, отправленные из C#, запустить ответ брандмауэра 403 от шлюза Azure/V2 WAFC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Что может привести к тому, что запросы, отправленные из C#, запустить ответ брандмауэра 403 от шлюза Azure/V2 WAF

Сообщение Anonymous »

Я разработал клиентское приложение, которое публикует внешний API (не под моим контролем) < /p>
, если я публикую от почтана или использую синтаксис .http, то запрос проходит мимо WAF в цель, а 202 возвращается. Например: это работает < /p>
POST https://api.xxxxxx.co.uk/upload
Authorization: Bearer R...o
Content-Type: multipart/form-data; boundary=4f71a923-41cd-4e34-a0a8-7bdd40dc059a

--4f71a923-41cd-4e34-a0a8-7bdd40dc059a
Content-Disposition: form-data; name="foo"

bar
--4f71a923-41cd-4e34-a0a8-7bdd40dc059a
< /code>
Если я опубликую, используя C#, запускается правило WAF (видно из журналов Azure) и 403 вернулся < /p>
403 Forbidden Microsoft-Azure-Application-Gateway/v2
< /code>
Учитывая рабочую почтальонную запись, которая возвращает 202, используя функцию почтальона, где он генерирует код, почтальон будет генерировать код C# httpclient, когда мы запускаем это, он возвращает 403. < /p>
Вот (аналогичный) минимальный образцы C#, который невероятно, в 403. PrettyPrint-Override ">using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

static async Task Main()
{
string accessToken = "R...do";

using var content = new MultipartFormDataContent();
content.Add(new StringContent("bar"), "foo");

using var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://api.xxxxx.co.uk");
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

var response = await httpClient.PostAsync("/upload", content);
var responseBody = await response.Content.ReadAsStringAsync();
}

await Main();
< /code>
К вашему сведению: другие запросы, представленные на один и тот же базовый URL, но в другой конечной точке, используя одну и ту же работу. Это не проблема. У меня были люди в других частях мира, запускающих код (в записной книжке Polyglot), и у каждого есть тот же результат (это не IP, VPN, интернет -провайдер и т. Д.) Как это будет отличить запрос HTTPClient от запроса почтальона или .http?using var content = new MultipartFormDataContent();
var stringContent = new StringContent("bar");
stringContent.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
content.Add(stringContent, "foo");
< /code>
@matthew Watson Спасибо за ответ.

Я изменил код в соответствии с вышеупомянутым, чтобы тип контента был явным. Это все еще 403, хотя, возможно, это не то, что вы имели в виду?var boundary = formData.Headers.ContentType.Parameters.First(o => o.Name == "boundary");
boundary.Value = boundary.Value.Replace("\"", String.Empty);
< /code>
Изменение границы, по -видимому, «исправить» проблему, хотя технически исходный код является правильным: .NET гарантирует, что значения заголовка соответствуют RFC, и в соответствии с RFC 2616 и RFC 7231 значения параметров, которые содержат специальные символы (такие как = или -) должны быть указаны. Что -то в API не так. Обновит это как можно скорее с помощью обновления/самостоятельного ответа на случай, если это поможет кому -то еще.


Подробнее здесь: https://stackoverflow.com/questions/797 ... response-f
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»