Przekierowanie do HTTPS

Jaki jest zalecany sposób przekierowania do HTTPS wszystkich przychodzących żądań, które nie są bezpieczne. Czy muszę pisać komponent middleware? Jeśli tak, nie mogłem dowiedzieć się, jak uzyskać nazwę serwera.

public class RedirectHttpMiddleware
{
    RequestDelegate _next;

    public RedirectHttpMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        if (context.Request.IsSecure)
            await _next(context);
        else
        {
            var server = "";  // How do I get the server name?
            context.Response.Redirect("https://" + server + context.Request.Path);
        }
    }
}
Author: Set, 2015-04-06

11 answers

Możesz użyć własnej klasy middleware, ale zazwyczaj robię coś takiego w mojej konfiguracji startowej:

app.Use(async (context, next) =>
{
    if (context.Request.IsHttps)
    {
        await next();
    }
    else
    {
        var withHttps = Uri.UriSchemeHttps + Uri.SchemeDelimiter + context.Request.Uri.GetComponents(UriComponents.AbsoluteUri & ~UriComponents.Scheme, UriFormat.SafeUnescaped);
        context.Response.Redirect(withHttps);
    }
});

To, co robi, to po prostu chwycić cały adres URL, ciąg zapytania i wszystkie, i użyć GetComponents, aby uzyskać wszystko z wyjątkiem schemat w URL. Następnie schemat HTTPS jest dołączany do adresu URL komponentów.

To będzie działać z pełnym. NET Framework, dla ASP.NET Core, możesz zrobić coś takiego:

app.Use(async (context, next) =>
{
    if (context.Request.IsHttps)
    {
        await next();
    }
    else
    {
        var withHttps = "https://" + context.Request.Host + context.Request.Path;
        context.Response.Redirect(withHttps);
    }
});

To dodaje hosta i ścieżkę do schemat HTTPS. Możesz również dodać inne komponenty, takie jak zapytanie i hash.

 41
Author: vcsjones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-27 12:33:08

Innym sposobem, który preferuję, jest użycie atrybutu/filtra [RequireHttps]. Możesz to zrobić albo ze swoimi kontrolerami:

[RequireHttps]
public class AccountController {
}

Albo to w Twoim starcie.cs w ConfigureServices:

services.Configure<MvcOptions>(options =>
{
    options.Filters.Add(new RequireHttpsAttribute());
}

Również, chciałem tylko dodać, że odpowiedź vcsjones jest również poprawna, ale musisz mieć pewność, aby dodać ten kod wcześnie w konfiguracji, przed jakimkolwiek innym Middleware / kod, który powoduje przekierowania. W moim przypadku dodałem go tuż przed dodaniem oprogramowania pośredniczącego Identity Framework.

 16
Author: Josh Mouch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-16 15:35:29

Pełna odpowiedź znajduje się w numerze 1, ale nie poprzestaj na konfigurowaniu HTTPS, przejdź dodatkowy krok:

1 - następnie używamy RequireHttpsAttribute do przekierowania na HTTPS i ustawiamy Port SSL w opcjach MVC. Odczytujemy również port SSL z launchSettings.json ale potrzebujemy tego tylko w trybie deweloperskim.

2-Użyj AddAntiforgery, aby wymagać HTTPS na tokenach zapobiegających fałszowaniu.

3-Użyj pakietu NWebsec.AspNetCore.Middleware NuGet i metody UseHsts, aby umożliwić ścisłe bezpieczeństwo transportu (HSTS) w całym obiekcie. Nie. zapomnij dodać Preload poniżej i prześlij swoją stronę do HSTS Preload site. Więcej informacji tutaj i tutaj.

4-Użyj pakietu NWebsec.AspNetCore.Middleware NuGet i metody UseHpkp, aby włączyć Przypinanie kluczy publicznych (Hpkp) w całej witrynie. Zauważ, że jeśli popełnisz błąd z tym jednym jesteś zasadniczo DoS'ing swojej stronie. Więcej informacji tutaj i tutaj.

5-Dołącz schemat https do dowolnego używanego adresu URL. Polityka Bezpieczeństwa Treści (CSP) nagłówek HTTP i integralność Subresource (SRI) {[17] } nie grają ładnie, gdy naśladujesz schemat w niektórych przeglądarkach. Lepiej być wyraźnym o HTTPS. np.

<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js"></script>

6-Użyj ASP.NET MVC Boilerplate szablon projektu Visual Studio do generowania projektu z tym wszystkim i o wiele więcej wbudowanych. Możesz również wyświetlić kod na GitHub.

Po tym wszystkim, twoja Startup klasa powinna wyglądać mniej więcej tak:

public class Startup
{
    private readonly int? sslPort;

    public Startup(IHostingEnvironment hostingEnvironment)
    {
        if (hostingEnvironment.IsDevelopment())
        {
            var launchConfiguration = new ConfigurationBuilder()
                .SetBasePath(hostingEnvironment.ContentRootPath)
                .AddJsonFile(@"Properties\launchSettings.json")
                .Build();
            // During development we won't be using port 443.
            this.sslPort = launchConfiguration.GetValue<int>("iisSettings:iisExpress:sslPort");
        }
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddAntiforgery(options =>
            {
                options.RequireSsl = true;
            });
            .AddMvc(options =>
            {
                options.Filters.Add(new RequireHttpsAttribute());
                options.SslPort = sslPort;
            });
    }

    public void Configure(IApplicationBuilder application)
    {
        application
            .UseHsts(options => options.MaxAge(days: 18 * 7).IncludeSubdomains().Preload())
            .UseHpkp(options => options
                .Sha256Pins(
                    "Base64 encoded SHA-256 hash of your first certificate e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=",
                    "Base64 encoded SHA-256 hash of your second backup certificate e.g. M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=")
                .MaxAge(days: 18 * 7)
                .IncludeSubdomains())
            .UseCsp(options => options
                .UpgradeInsecureRequests(this.sslPort.HasValue ? this.sslPort.Value : 443))
            .UseMvc();
    }
}
 12
Author: Muhammad Rehan Saeed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-01 07:04:39

Jeśli chcesz pobrać Port w środowisku DEV w. NET Core, spójrz na env.IsDevelopment() i warunkowo pobrać Port SSL z launchSettings.json.

if (env.IsDevelopment())
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile(@"Properties/launchSettings.json", optional: false, reloadOnChange: true);
    var launchConfig = builder.Build();
    sslPort = launchConfig.GetValue<int>("iisSettings:iisExpress:sslPort");
}

`

Po pobraniu portu SSL, możesz włączyć port do rozwiązania opublikowanego przez @vcsjones.

 3
Author: long2know,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 17:52:44

AlwaysHttpsMiddleware.cs, zainspirowany Requieshttpsattribute.

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

public class AlwaysHttpsMiddleware
{
    private readonly RequestDelegate _next;

    public AlwaysHttpsMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        if (context.Request.IsHttps)
        {
            await _next.Invoke(context);
        }
        else
        {
            var request = context.Request;

            // only redirect for GET requests, otherwise the browser might
            // not propagate the verb and request body correctly.

            if (!string.Equals(request.Method, "GET", StringComparison.OrdinalIgnoreCase))
            {
                context.Response.StatusCode = StatusCodes.Status403Forbidden;
                await context.Response.WriteAsync("This site requires HTTPS.");
            }
            else
            {
                var newUrl = string.Concat(
                    "https://",
                    request.Host.ToUriComponent(),
                    request.PathBase.ToUriComponent(),
                    request.Path.ToUriComponent(),
                    request.QueryString.ToUriComponent());

                context.Response.Redirect(newUrl);
            }
        }
    }
}

Startup.cs

public void Configure(IApplicationBuilder app)
{
    if (_env.IsProduction())
    {
        app.UseMiddleware<AlwaysHttpsMiddleware>();
    }
 }
 2
Author: Shaun Luttin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-24 03:58:06

Zmodyfikowałem nieco odpowiedź @vcsjones, aby używać niestandardowego portu w środowisku dev. Również podziękowania dla @ long2know.

app.Use(async (context, next) =>
{
    var request = context.Request;

    if (request.IsHttps)
    {
        await next();
    }
    else
    {
        var devPort = Configuration.GetValue<int>("iisSettings:iisExpress:sslPort");

        var host = env.IsDevelopment() && devPort > 0
            ? new HostString(request.Host.Host, devPort)
            : new HostString(request.Host.Host);

        string newUrl = $"https://{host}{request.PathBase}{request.Path}{request.QueryString}";
        context.Response.Redirect(newUrl, true);
    }
});

Musi pojawić się przed aplikacją.UseStaticFiles lub app.UseMvc, w przeciwnym razie zostanie zignorowany.

Należy pamiętać, że port powinien być pobrany z pliku launchSettings.json, więc należy również dodać ten plik do ConfigurationBuilder w Startup.cs:

.AddJsonFile(@"Properties/launchSettings.json", optional: false, reloadOnChange: true)

 2
Author: Olegas Gončarovas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-04 16:11:04

Jest tu kilka świetnych odpowiedzi, ale potrzebowałem rozwiązania, które działałoby z IIS lub bez niego, a także nie zmieniało protokołu podczas lokalnego debugowania. Dodałem to zaraz po dodaniu ad auth do potoku przy starcie.Konfiguracja metody. Chodzi o pełne ramy. Inne rozwiązania tutaj opisują jak odbudować adres URL dla Core.

app.Use(async (context, next) =>
{
    if (context.Request.IsHttps || // Handles https straight to the server 
        context.Request.Headers["X-Forwarded-Proto"] == Uri.UriSchemeHttps || // Handles an IIS or Azure passthrough
        context.Request.Host.ToString().StartsWith("localhost",true, System.Globalization.CultureInfo.InvariantCulture) || // Ignore for localhost
        context.Request.Headers["X-Forwarded-Proto"].Contains( Uri.UriSchemeHttps )) // X-Forwarded-Proto can have multiple values if there are multiple proxies 
    {
        await next();
    }
    else
    {
        var withHttps = Uri.UriSchemeHttps + Uri.SchemeDelimiter + context.Request.Host + context.Request.Path + context.Request.QueryString;
        context.Response.Redirect(withHttps);
    }
});
 0
Author: EricksonG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-30 17:42:09

Aby Twoja aplikacja DOTNet Core działała pod protokołem HTTPS, należy wykonać trzy kroki:

  1. Przejdź do ustawień uruchamiania aplikacji.plik json i wprowadź żądany port https z 44390-44399 Tutaj wpisz opis obrazka
  2. Edytuj swój Startup.plik cs. Wpisz następujący kod:

    services.Configure<MvcOptions>(options =>
    {
        options.SslPort = 44390;
        options.Filters.Add(new RequireHttpsAttribute());
    });
    

    Tutaj wpisz opis obrazka

  3. Kliknij prawym przyciskiem myszy Główny katalog projektu w Eksploratorze rozwiązań i wybierz Właściwości. Zaznacz Włącz SSL, skopiuj SSL link i dodaj go do obszaru URL aplikacji. Tutaj wpisz opis obrazka

    1. Uruchom aplikację. Zawsze będzie działać w kontekście HTTPS.
 0
Author: Johnny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-14 23:37:27

Jedna z technik omawianych na https://github.com/aspnet/KestrelHttpServer/issues/916 dodaje to do twojej sieci.config:

<rewrite>
      <rules>
          <rule name="HTTP/S to HTTPS Redirect" enabled="true" stopProcessing="true">
          <match url="(.*)" />
          <conditions logicalGrouping="MatchAny">
              <add input="{SERVER_PORT_SECURE}" pattern="^0$" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
          </rule>
      </rules>
</rewrite>
 0
Author: SaltySub2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-03 06:05:24

Lubię atrybut z dyrektywą kompilatora

#if !DEBUG
    [RequireHttps]
#endif
    public class HomeController : Controller
    {
    }
 0
Author: Roman S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-15 21:39:09

W ASP.NET Core 2.1 wystarczy użyć tego:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();   // <-- Add this !!!!!
    }

    app.UseHttpsRedirection(); // <-- Add this !!!!!
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}
 0
Author: Yanga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-13 07:30:49