Перейти к содержанию

Делаем так, чтобы протокол HTTPS использовался для всего приложения

В наши дни требуется практически принудительное использования HTTPS для всего веб-сайта. Помимо соображений безопасности можно упомянуть, что благодаря протоколу HTTP/2 добавление TLS может улучшить производительность приложения.

Существует несколько подходов сделать так, чтобы HTTPS использовался для всего приложения.

Примечание

Описанные в разделе меры применяются, в первую очередь, для приложений Razor Pages. Веб-API может просто отклонять HTTP запросы. Дополнительно

Один из таких подходов — использовать заголовки безопасности HTTP1.

Принудительное использование HTTPS с помощью заголовков HTTP Strict Transport Security

По умолчанию браузеры загружают приложения по протоколу HTTP. Следовательно, приложения должны поддерживать и HTTP, и HTTPS. Один из способов смягчить это заключается в добавлении заголовка HSTS.

Определение

HTTP Strict Transport Security (HSTS) — заголовок, указывающий браузеру использовать HTTPS для всех последующих запросов к приложению. Его можно отправлять только лишь с ответами на HTTPS запросы. Также использование этого заголовка не влияет на обмен данными между серверами и актуально только для запросов из браузера2.

Заголовки HSTS рекомендуются для приложений в промышленном окружении, однако нет смысла для использования его в окружении разработки, так как непросто (а иногда и невозможно) отключить использование HTTPS для сайта, после того, как он был “включён” при помощи HSTS.
ASP.NET Core поставляется с промежуточным ПО для установки заголовков HSTS. Вот как использовать его в Startup.cs:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        services.AddHsts(options => 
        {
            options.MaxAge = TimeSpan.FromHours(1);
        });
    }

    public void Configure(IApplication app, IWebHostEnvironment env)
    {
        if(env.IsProduction())
        {
            app.UseHsts(); //HstsMiddleware должен идти в самом начале конвейера
        }

        app.UseStaticFiles();
        app.UseRouting();
        app.UseAuthorization();
        app.UseEndpoints(endpoints => 
        {
            endpoints.MapRazorPages();
        });
    }
}

Совет

В примере показано, как изменить значение MaxAge заголовка HSTS. Лучше начать с небольшого значения, чтобы потом, убедившись, что всё хорошо, увеличить его.

Обычно HstsMiddleware следует использовать совместно с компонентом, перенаправляющим все запросы с HTTP на HTTPS.

Переадресация с HTTP на HTTPS с помощью компонента HttpsRedirectionMiddleware

ASP.NET Core поставляется с компонентом HttpsRedirectionMiddleware, который можно использовать для принудительного использования HTTPS в приложении.
Если запрос доходит до HttpsRedirectionMiddleware, выполнение запроса прерывается, выполняя перенаправление на HTTPS версию запроса3. Перенаправление по умолчанию происходит с использованием HTTP кода 307 Temporary Redirect.
Вот как его обычно используют:

public void Configure(IApplication app, IWebHostEnvironment env)
{
    app.UseExceptionHandler("/Error");
    if(env.IsProduction())
    {
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints => 
    {
        endpoints.MapRazorPages();
    });
}

HTTP запросы будут перенаправляться в первую сконфигурированную точку HTTPS. Если требуется перенаправление на другой порт (о котором знает Kestrel), его можно указать, используя переменную окружения ASPNETCORE_HTTPS_PORT4.
Если приложение не настроено на использование HTTPS, вместо перенаправление будет логироваться предупреждение вида

Failed to determine the https port for redirect.


  1. Статья о заголовках безопасности 

  2. Подробнее о HSTS 

  3. Видно, что, несмотря на использование HSTS и перенаправления, один HTTP запрос всё равно выполняется. Единственный способ избежать этого — предварительно загрузить заголовки HSTS. 

  4. Подробнее о настройке 


Последнее обновление : 8 мая 2023 г.
Дата создания : 24 октября 2022 г.

Комментарии

Комментарии