Я разработал клиентское приложение, которое публикует внешний 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
Что может привести к тому, что запросы, отправленные из C#, запустить ответ брандмауэра 403 от шлюза Azure/V2 WAF ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение