it-swarm.com.de

Umleitung zu HTTPS

Wie wird empfohlen, alle eingehenden Anforderungen, die nicht sicher sind, an HTTPS umzuleiten. Muss ich eine Middleware-Komponente schreiben? Wenn ja, konnte ich nicht herausfinden, wie ich den Servernamen bekomme.

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);
        }
    }
}
34
William

Sie können Ihre eigene Middleware-Klasse verwenden, aber normalerweise mache ich in meiner Startkonfiguration so etwas wie folgt:

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);
    }
});

Was dies tut, ist einfach die gesamte URL, die Abfragezeichenfolge und alle zu packen und GetComponents zu verwenden, um alles außer das Schema in der URL abzurufen. Dann wird das HTTPS-Schema der Komponenten-URL vorangestellt.

Dies funktioniert mit dem vollständigen .NET Framework. Für ASP.NET Core können Sie Folgendes tun:

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);
    }
});

Der Host und der Pfad werden an das HTTPS-Schema angehängt. Sie können auch andere Komponenten wie Abfrage und Hash hinzufügen.

43
vcsjones

Für .NET Core 2.0 und niedriger ( offizielle Dokumente für 2.0 ):

Verwenden Sie das [RequireHttps]-Attribut/Filter . Sie können dies entweder für Ihre Controller tun:

[RequireHttps]
public class AccountController {
}

Oder fügen Sie dies in Ihren Startup.cs in der ConfigureServices-Methode ein:

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

Ich wollte auch nur hinzufügen, dass die Antwort von vcsjones auch korrekt ist, aber Sie müssen diesen Code frühzeitig in Ihrer Konfiguration hinzufügen, bevor alle anderen Middleware/Codes, die Weiterleitungen verursachen. In meinem Fall habe ich hinzugefügt kurz bevor ich die Identity Framework-Middleware hinzugefügt habe.

16
Josh Mouch

Die vollständige Antwort ist in Nummer 1, aber beenden Sie die Einrichtung von HTTPS nicht.

1 - Wir verwenden die Variable RequireHttpsAttribute, um zu HTTPS umzuleiten, und legen den SSL-Port in den MVC-Optionen fest. Wir lesen auch den SSL-Port von launchSettings.json, aber wir benötigen ihn nur im Entwicklungsmodus.

2 - Verwenden Sie AddAntiforgery, um HTTPS auf Ihren Anti-Fälschungs-Token anzufordern.

3 - Verwenden Sie das NWebsec.AspNetCore.Middleware NuGet-Paket und die UseHsts-Methode, um Strict Transport Security (HSTS) über den gesamten Standort zu aktivieren. Vergessen Sie nicht, die Preload unten hinzuzufügen und Ihre Site an die HSTS Preload Site zu senden. Weitere Informationen hier und hier .

4 - Verwenden Sie das NWebsec.AspNetCore.Middleware NuGet-Paket und die UseHpkp-Methode, um das Public Key Pinning (HPKP) für den gesamten Standort zu aktivieren. Beachten Sie, dass Sie, wenn Sie mit dieser einen Fehler machen, im Wesentlichen DoS'ing auf Ihrer Website durchführen. Weitere Informationen hier und hier .

5 - Fügen Sie das https-Schema in die verwendeten URLs ein. Content Security Policy (CSP) HTTP-Header und Subresource Integrity (SRI) spielen Nice nicht, wenn Sie das Schema in einigen Browsern nachahmen. Es ist besser, explizit über HTTPS zu sprechen. z.B.

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

6- Verwenden Sie die Projektvorlage " ASP.NET MVC Boilerplate Visual Studio", um ein Projekt mit all dem und vielem mehr zu erstellen. Sie können den Code auch unter GitHub anzeigen.

Nach all dem sollte die Startup-Klasse ungefähr so ​​aussehen:

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

Wenn Sie den Port in einer DEV-Umgebung in .NET Core abrufen möchten, schauen Sie sich env.IsDevelopment() an und greifen Sie unter bestimmten Bedingungen den SSL-Port von launchSettings.json auf.

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");
}

`

Nachdem Sie den SSL-Port erworben haben, können Sie den Port in die von @vcsjones bereitgestellte Lösung integrieren.

3
long2know

Ich habe ein wenig @vcsjones Antwort geändert, um kundenspezifischen Hafen in der Entwicklerumgebung zu verwenden. Wir danken auch @ 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);
    }
});

Dies muss vor app.UseStaticFiles oder app.UseMvc stehen, sonst wird es ignoriert.

Beachten Sie, dass der Port aus der Datei launchSettings.json Entnommen werden sollte. Fügen Sie diese Datei daher auch zu ConfigurationBuilder in der Datei Startup.cs Hinzu:

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

2

AlwaysHttpsMiddleware.cs, inspiriert von RequiresHttpsAttribute.

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
Shaun Luttin

Verwenden Sie in ASP.NET Core 2.1 einfach Folgendes:

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();
}
1
Yanga

Damit Ihre DOTNet Core-Anwendung unter HTTPS ausgeführt werden kann, müssen Sie drei Schritte ausführen:

  1. Navigieren Sie zur Datei launchSettings.json Ihrer Anwendung und geben Sie den gewünschten https-Port von 44390-44399 ein enter image description here
  2. Bearbeiten Sie Ihre Startup.cs-Datei. Geben Sie den folgenden Code ein:

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

    enter image description here

  3. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projektstammverzeichnis, und wählen Sie Eigenschaften aus. Aktivieren Sie SSL aktivieren, kopieren Sie den SSL-Link und fügen Sie ihn dem App-URL-Bereich hinzu . enter image description here

    1. Starte die Anwendung. Es wird immer im HTTPS-Kontext ausgeführt.
0
Johnny

Hier gibt es einige großartige Antworten, aber ich brauchte eine Lösung, die mit oder ohne IIS funktioniert und das Protokoll während des lokalen Debugging nicht ändert. Ich habe dies direkt nach dem Hinzufügen von AD auth zur Pipeline in der Startup.Configure-Methode hinzugefügt. Dies ist für den vollen Rahmen. Andere Lösungen beschreiben hier, wie Sie die URL für Core neu erstellen.

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
EricksonG

Eine unter https://github.com/aspnet/KestrelHttpServer/issues/916 diskutierte Technik fügt dies Ihrer web.config hinzu:

<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
SaltySub2