MK-Gii Ответов: 1

Asp.net основные заголовки по умолчанию


- Привет.

У меня есть очень интересный сценарий, когда asp.net основное приложение добавляет что-то дополнительное к моим заголовкам. Я проверяю все входящие запросы и использую промежуточное программное обеспечение для проверки заголовков перед обработкой запроса:
public async Task Invoke(HttpContext httpContext)
{
    if (httpContext.Request.Headers.Keys.ToArray()[0] != "UserKey")
    {
        throw new Exception("Wrong header order");
    }

    await _next(httpContext);
}


Я также установил это в startup.cs:
<pre>public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // do this before others
    app.UseMiddleware<HeaderHandlingMiddleware>();

    app.UseMvc();
}


Хотя по какой-то причине, когда я пытаюсь проверить заголовки в то время, когда запрос находится в промежуточном программном обеспечении, я вижу, что некоторые заголовки по умолчанию были добавлены для "подключения" и "поддержания жизни". И они были установлены сверху (то есть они первые в коллекции заголовков).
Я попробовал сделать ручной запрос с таким скрипачом:
GET http://localhost:49669/headers HTTP/1.1
Key_1: Value_1
Key_2: Value_2
Key_3: Value_3
Host: localhost:49669
Connection: Close


Но все же - когда я проверяю заголовки, я вижу, что соединение было настроено на "Keep-Alive", и порядок заголовков был потерян.
Есть идеи, где искать?
Может быть, есть какое-то дополнительное событие, к которому я могу подключиться (без использования промежуточного программного обеспечения)?

br,
м

Что я уже пробовал:

Попробовал использовать класс middleware, но это не помогло.

1 Ответов

Рейтинг:
2

Richard Deeming

Это не имеет никакого отношения к делу. ASP.NET; эти заголовки отправляются клиенту.

Порядок получения полей заголовка с разными именами полей не является существенным. Однако "хорошей практикой" является отправка сначала полей общего заголовка, затем полей заголовка запроса или заголовка ответа и, наконец, полей заголовка сущности.

Большинство клиентов будут ставить "общие" заголовки - например Connection и Keep-Alive - перед любыми другими заголовками.

Полагаться на заголовки, отправляемые в определенном порядке, чрезвычайно хрупко и сломается почти сразу.

Вместо этого следует проверить, содержит ли словарь заголовков ожидаемый заголовок:
public async Task Invoke(HttpContext httpContext)
{
    if (!httpContext.Request.Headers.ContainsKey("UserKey"))
    {
        throw new InvalidOperationException("Required header is missing.");
    }

    await _next(httpContext);
}


MK-Gii

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