Enforce HTTPS in an ASP.NET Core

[ad_1]


By Rick Anderson

This document shows how to:

  • Require HTTPS for all requests.
  • Redirect all HTTP requests to HTTPS.

Warning

Do not use RequireHttpsAttribute on Web APIs that receive sensitive information. RequireHttpsAttribute uses HTTP status codes to redirect browsers from HTTP to HTTPS. API clients may not understand or obey redirects from HTTP to HTTPS. Such clients may send information over HTTP. Web APIs should either:

  • Not listen on HTTP.
  • Close the connection with status code 400 (Bad Request) and not serve the request.

Require HTTPS

Note

ASP.NET Core 2.1 is in preview and not recommended for production use.

We recommend all ASP.NET Core web apps call UseHttpsRedirection to redirect all HTTP requests to HTTPS. If UseHsts is called in the app, it must be called before UseHttpsRedirection.

The following code calls UseHttpsRedirection in the Startup class:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    if (env.IsDevelopment())
    
        app.UseDeveloperExceptionPage();
    
    else
    
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();

The following code:

public void ConfigureServices(IServiceCollection services)

    services.AddMvc();

    services.AddHsts(options =>
    
        options.Preload = true;
        options.IncludeSubDomains = true;
        options.MaxAge = TimeSpan.FromDays(60);
        options.ExcludedHosts.Add("example.com");
        options.ExcludedHosts.Add("www.example.com");
    );

    services.AddHttpsRedirection(options =>
    
        options.RedirectStatusCode = StatusCodes.Status301MovedPermanently;
        options.HttpsPort = 5001;
    );            

  • Sets RedirectStatusCode.
  • Sets the HTTPS port to 5001.

The RequireHttpsAttribute is used to require HTTPS. [RequireHttpsAttribute] can decorate controllers or methods, or can be applied globally. To apply the attribute globally, add the following code to ConfigureServices in Startup:

// Requires using Microsoft.AspNetCore.Mvc;
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MvcOptions>(options =>
    
        options.Filters.Add(new RequireHttpsAttribute());
    );

The preceding highlighted code requires all requests use HTTPS; therefore, HTTP requests are ignored. The following highlighted code redirects all HTTP requests to HTTPS:

// Requires using Microsoft.AspNetCore.Rewrite;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    var options = new RewriteOptions()
       .AddRedirectToHttps();

    app.UseRewriter(options);

For more information, see URL Rewriting Middleware.

Requiring HTTPS globally (options.Filters.Add(new RequireHttpsAttribute());) is a security best practice. Applying the
[RequireHttps] attribute to all controllers/Razor Pages isn’t considered as secure as requiring HTTPS globally. You can’t guarantee the [RequireHttps] attribute is applied when new controllers and Razor Pages are added.

HTTP Strict Transport Security Protocol (HSTS)

Per OWASP, HTTP Strict Transport Security (HSTS) is an opt-in security enhancement that is specified by a web application through the use of a special response header. Once a supported browser receives this header that browser will prevent any communications from being sent over HTTP to the specified domain and will instead send all communications over HTTPS. It also prevents HTTPS click through prompts on browsers.

ASP.NET Core 2.1 preview1 or later implements HSTS with the UseHsts extension method. The following code calls UseHsts when the app isn’t in development mode:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    if (env.IsDevelopment())
    
        app.UseDeveloperExceptionPage();
    
    else
    
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();

UseHsts is not recommend in development because the HSTS header is highly cachable by browsers. By default, UseHsts excludes the local loopback address.

The following code:

public void ConfigureServices(IServiceCollection services)

    services.AddMvc();

    services.AddHsts(options =>
    
        options.Preload = true;
        options.IncludeSubDomains = true;
        options.MaxAge = TimeSpan.FromDays(60);
        options.ExcludedHosts.Add("example.com");
        options.ExcludedHosts.Add("www.example.com");
    );

    services.AddHttpsRedirection(options =>
    
        options.RedirectStatusCode = StatusCodes.Status301MovedPermanently;
        options.HttpsPort = 5001;
    );            

  • Sets the preload parameter of the Strict-Transport-Security header. Preload is not part of the RFC HSTS specification, but is supported by web browsers to preload HSTS sites on fresh install. See https://hstspreload.org/ for more information.
  • Enables includeSubDomain, which applies the HSTS policy to Host subdomains.
  • Explicitly sets the max-age parameter of the Strict-Transport-Security header to to 60 days. If not set, defaults to 30 days. See the max-age directive for more information.
  • Adds example.com to the list of hosts to exclude.

UseHsts excludes the following loopback hosts:

  • localhost : The IPv4 loopback address.
  • ۱۲۷٫۰٫۰٫۱ : The IPv4 loopback address.
  • [::۱] : The IPv6 loopback address.

The preceding example shows how to add additional hosts.

Opt-out of HTTPS on project creation

The ASP.NET Core 2.1 and later web application templates (from Visual Studio or the dotnet command line) enable HTTPS redirection and HSTS. For deployments that don’t require HTTPS, you can opt-out of HTTPS. For example, some backend services where HTTPS is being handled externally at the edge, using HTTPS at each node is not needed.

To opt-out of HTTPS:

Uncheck the Configure for HTTPS checkbox.

Entity diagram




[ad_2]

source_link
https://www.asp.net