Frage

Vor etwa 6 Monaten habe ich eine Website eingeführt, auf der jede Anfrage über https erfolgen musste.Die einzige Möglichkeit, die ich damals finden konnte, um sicherzustellen, dass jede Anfrage an eine Seite über https erfolgte, bestand darin, sie im Seitenladeereignis zu überprüfen.Wenn die Anfrage nicht über http erfolgen würde, würde ich „response.redirect(““https://example.com")

Gibt es einen besseren Weg – idealerweise eine Einstellung in der web.config?

War es hilfreich?

Lösung

Bitte verwenden Sie HSTS

aus http://www.hanselman.com/blog/HowToEnableHTTPStrictTransportSecurityHSTSInIIS7.aspx

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"
                        redirectType="Permanent" />
                </rule>
            </rules>
            <outboundRules>
                <rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
                    <match serverVariable="RESPONSE_Strict_Transport_Security"
                        pattern=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="on" ignoreCase="true" />
                    </conditions>
                    <action type="Rewrite" value="max-age=31536000" />
                </rule>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

Ursprüngliche Antwort (am 4. Dezember 2015 durch das obige ersetzt)

grundsätzlich

protected void Application_BeginRequest(Object sender, EventArgs e)
{
   if (HttpContext.Current.Request.IsSecureConnection.Equals(false) && HttpContext.Current.Request.IsLocal.Equals(false))
   {
    Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"]
+   HttpContext.Current.Request.RawUrl);
   }
}

das würde in global.asax.cs (oder global.asax.vb) stehen

Ich kenne keine Möglichkeit, es in der web.config anzugeben

Andere Tipps

Das andere, was Sie tun können, ist zu verwenden HSTS indem der Header „Strict-Transport-Security“ an den Browser zurückgegeben wird.Der Browser muss dies unterstützen (und derzeit sind es vor allem Chrome und Firefox), aber das bedeutet, dass der Browser nach der Einstellung keine Anfragen an die Website über HTTP stellt, sondern diese vor der Ausgabe in HTTPS-Anfragen übersetzt .Versuchen Sie dies in Kombination mit einer Weiterleitung von HTTP:

protected void Application_BeginRequest(Object sender, EventArgs e)
{
  switch (Request.Url.Scheme)
  {
    case "https":
      Response.AddHeader("Strict-Transport-Security", "max-age=300");
      break;
    case "http":
      var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
      Response.Status = "301 Moved Permanently";
      Response.AddHeader("Location", path);
      break;
  }
}

Browser, die HSTS nicht unterstützen, ignorieren den Header einfach, werden aber trotzdem von der switch-Anweisung abgefangen und an HTTPS weitergeleitet.

Mit dem IIS7-Modul können Sie umleiten.

    <rewrite>
        <rules>
            <rule name="Redirect HTTP to HTTPS" stopProcessing="true">
                <match url="(.*)"/>
                <conditions>
                    <add input="{HTTPS}" pattern="^OFF$"/>
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther"/>
            </rule>
        </rules>
    </rewrite>

Für diejenigen, die ASP.NET MVC verwenden.Sie können Folgendes verwenden, um SSL/TLS über HTTPS auf zwei Arten auf der gesamten Site zu erzwingen:

Der harte Weg

1 – Fügen Sie das RequireHttpsAttribute zu den globalen Filtern hinzu:

GlobalFilters.Filters.Add(new RequireHttpsAttribute());

2 – Erzwingen Sie die Verwendung von SSL/TLS durch Anti-Forgery-Token:

AntiForgeryConfig.RequireSsl = true;

3 – Erzwingen Sie, dass Cookies standardmäßig HTTPS erfordern, indem Sie die Datei Web.config ändern:

<system.web>
    <httpCookies httpOnlyCookies="true" requireSSL="true" />
</system.web>

4 – Verwenden Sie das NWebSec.Owin NuGet-Paket und fügen Sie die folgende Codezeile hinzu, um Strict Transport Security auf der gesamten Site zu aktivieren.Vergessen Sie nicht, unten die Preload-Anweisung hinzuzufügen und Ihre Website an die zu senden HSTS-Preload-Site.Mehr Informationen Hier Und Hier.Beachten Sie, dass es, wenn Sie OWIN nicht verwenden, eine Web.config-Methode gibt, die Sie hier nachlesen können NWebSec Website.

// app is your OWIN IAppBuilder app in Startup.cs
app.UseHsts(options => options.MaxAge(days: 30).Preload());

5 – Verwenden Sie das NWebSec.Owin NuGet-Paket und fügen Sie die folgende Codezeile hinzu, um Public Key Pinning (HPKP) auf der gesamten Site zu aktivieren.Mehr Informationen Hier Und Hier.

// app is your OWIN IAppBuilder app in Startup.cs
app.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: 30));

6 – Fügen Sie das https-Schema in alle verwendeten URLs ein. Inhaltssicherheitsrichtlinie (CSP) HTTP-Header und Subressourcenintegrität (SRI) Spielen Sie nicht nett, wenn Sie das Schema in einigen Browsern nachahmen.Es ist besser, HTTPS explizit anzugeben.z.B.

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

Der einfache Weg

Benutzen Sie die ASP.NET MVC Boilerplate Visual Studio-Projektvorlage zum Generieren eines Projekts mit all dem und noch viel mehr.Sie können den Code auch auf einsehen GitHub.

Wenn Sie dies aus irgendeinem Grund nicht in IIS einrichten können, würde ich ein HTTP-Modul erstellen, das die Umleitung für Sie übernimmt:

using System;
using System.Web;

namespace HttpsOnly
{
    /// <summary>
    /// Redirects the Request to HTTPS if it comes in on an insecure channel.
    /// </summary>
    public class HttpsOnlyModule : IHttpModule
    {
        public void Init(HttpApplication app)
        {
            // Note we cannot trust IsSecureConnection when 
            // in a webfarm, because usually only the load balancer 
            // will come in on a secure port the request will be then 
            // internally redirected to local machine on a specified port.

            // Move this to a config file, if your behind a farm, 
            // set this to the local port used internally.
            int specialPort = 443;

            if (!app.Context.Request.IsSecureConnection 
               || app.Context.Request.Url.Port != specialPort)
            {
               app.Context.Response.Redirect("https://" 
                  + app.Context.Request.ServerVariables["HTTP_HOST"] 
                  + app.Context.Request.RawUrl);    
            }
        }

        public void Dispose()
        {
            // Needed for IHttpModule
        }
    }
}

Dann kompilieren Sie es einfach in eine DLL, fügen Sie es als Referenz zu Ihrem Projekt hinzu und platzieren Sie es in web.config:

 <httpModules>
      <add name="HttpsOnlyModule" type="HttpsOnly.HttpsOnlyModule, HttpsOnly" />
 </httpModules>

Was Sie tun müssen, ist:

1) Fügen Sie einen Schlüssel in web.config hinzu, abhängig vom Produktions- oder Bühnenserver, wie unten beschrieben

<add key="HttpsServer" value="stage"/>
             or
<add key="HttpsServer" value="prod"/>

2) Fügen Sie in Ihrer Global.asax-Datei die folgende Methode hinzu.

void Application_BeginRequest(Object sender, EventArgs e)
{
    //if (ConfigurationManager.AppSettings["HttpsServer"].ToString() == "prod")
    if (ConfigurationManager.AppSettings["HttpsServer"].ToString() == "stage")
    {
        if (!HttpContext.Current.Request.IsSecureConnection)
        {
            if (!Request.Url.GetLeftPart(UriPartial.Authority).Contains("www"))
            {
                HttpContext.Current.Response.Redirect(
                    Request.Url.GetLeftPart(UriPartial.Authority).Replace("http://", "https://www."), true);
            }
            else
            {
                HttpContext.Current.Response.Redirect(
                    Request.Url.GetLeftPart(UriPartial.Authority).Replace("http://", "https://"), true);
            }
        }
    }
}

Wenn die SSL-Unterstützung auf Ihrer Site nicht konfigurierbar ist (d. h.sollte in der Lage sein, https ein-/auszuschalten) – Sie können das Attribut [RequireHttps] für jeden Controller/jede Controller-Aktion verwenden, die Sie sichern möchten.

Es hängt auch von der Marke Ihres Balancers ab. Für den Web-Mux müssten Sie nach einem http-Header suchen X-WebMux-SSL-termination: true um herauszufinden, dass der eingehende Datenverkehr SSL war.Details hier: http://www.cainetworks.com/support/redirect2ssl.html

Für @Joe oben: „Das gibt mir eine Umleitungsschleife.“Bevor ich den Code hinzugefügt habe, hat es gut funktioniert.Irgendwelche Vorschläge?– Joe, 8. November 2011, 16:13 Uhr

Das ist mir auch passiert und ich glaube, dass es einen Load Balancer gab, der die SSL-Anfrage vor dem Webserver beendete.Daher ging meine Website immer davon aus, dass die Anfrage „http“ sei, auch wenn der ursprüngliche Browser sie als „https“ anforderte.

Ich gebe zu, das ist ein bisschen umständlich, aber für mich hat es funktioniert, eine „JustRedirected“-Eigenschaft zu implementieren, die ich nutzen konnte, um herauszufinden, dass die Person bereits einmal umgeleitet wurde.Daher teste ich, ob bestimmte Bedingungen die Umleitung rechtfertigen, und wenn sie erfüllt sind, lege ich diese Eigenschaft (in der Sitzung gespeicherter Wert) vor der Umleitung fest.Selbst wenn die http/https-Bedingungen für die Umleitung beim zweiten Mal erfüllt sind, umgehe ich die Umleitungslogik und setze den Sitzungswert „JustRedirected“ auf „false“ zurück.Sie benötigen Ihre eigene bedingte Testlogik, aber hier ist eine einfache Implementierung der Eigenschaft:

    public bool JustRedirected
    {
        get
        {
            if (Session[RosadaConst.JUSTREDIRECTED] == null)
                return false;

            return (bool)Session[RosadaConst.JUSTREDIRECTED];
        }
        set
        {
            Session[RosadaConst.JUSTREDIRECTED] = value;
        }
    }

Ich werde meinen Beitrag dazu leisten. WENN Wenn Sie Zugriff auf die IIS-Serverseite haben, können Sie mithilfe der Protokollbindungen HTTPS erzwingen.Sie haben beispielsweise eine Website mit dem Namen Bla.In IIS würden Sie zwei Sites einrichten: Bla, Und Blah (Weiterleiten).Für Bla Konfigurieren Sie nur die HTTPS verbindlich (und FTP Stellen Sie bei Bedarf sicher, dass auch die Verbindung über eine sichere Verbindung erzwungen wird.Für Blah (Weiterleiten) Konfigurieren Sie nur die HTTP Bindung.Schließlich in der HTTP-Umleitung Abschnitt für Blah (Weiterleiten) Stellen Sie sicher, dass Sie eine 301-Weiterleitung festlegen https://blah.com, mit aktiviertem genauen Ziel.Stellen Sie sicher, dass jede Site in IIS auf sie verweist eigen Stammordner, andernfalls der Web.config wird alles vermasseln.Stellen Sie außerdem sicher, dass Sie Folgendes haben HSTS auf Ihrer HTTPS-Site so konfiguriert, dass nachfolgende Anfragen des Browsers immer zu HTTPS gezwungen werden und keine Weiterleitungen erfolgen.

Dies ist eine ausführlichere Antwort, die auf der von @Troy Hunt basiert.Fügen Sie diese Funktion zu Ihrem hinzu WebApplication Klasse in Global.asax.cs:

    protected void Application_BeginRequest(Object sender, EventArgs e)
    {
        // Allow https pages in debugging
        if (Request.IsLocal)
        {
            if (Request.Url.Scheme == "http")
            {
                int localSslPort = 44362; // Your local IIS port for HTTPS

                var path = "https://" + Request.Url.Host + ":" + localSslPort + Request.Url.PathAndQuery;

                Response.Status = "301 Moved Permanently";
                Response.AddHeader("Location", path);
            }
        }
        else
        {
            switch (Request.Url.Scheme)
            {
                case "https":
                    Response.AddHeader("Strict-Transport-Security", "max-age=31536000");
                    break;
                case "http":
                    var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
                    Response.Status = "301 Moved Permanently";
                    Response.AddHeader("Location", path);
                    break;
            }
        }
    }

(Um SSL für Ihren lokalen Build zu aktivieren, aktivieren Sie es im Eigenschaften-Dock für das Projekt.)

-> Fügen Sie einfach [RequireHttps] oben zur öffentlichen Klasse HomeController hinzu:Regler.

-> Und füge GlobalFilters.Filters.Add(new RequireHttpsAttribute());in der Methode „protected void Application_Start()“ in der Datei Global.asax.cs.

Dadurch wird Ihre gesamte Anwendung auf HTTPS gezwungen.

Ich habe einige Zeit damit verbracht, nach sinnvollen Best Practices zu suchen, und habe Folgendes gefunden, das für mich perfekt funktioniert hat.Ich hoffe, das wird Ihnen irgendwann helfen.

Benutzen Konfigurationsdatei (zum Beispiel eine asp.net-Website)https://blogs.msdn.microsoft.com/kaushal/2013/05/22/http-to-https-redirects-on-iis-7-x-and-higher/

oder auf Ihrem eigenen Serverhttps://www.sslshopper.com/iis7-redirect-http-to-https.html

Kurze Antwort] einfach der folgende Code geht hinein

<system.webServer> 
 <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}{REQUEST_URI}" 
        redirectType="Permanent" />
        </rule>
       </rules>
 </rewrite>

Wenn Sie ASP.NET Core verwenden, können Sie das Nuget-Paket SaidOut.AspNetCore.HttpsWithStrictTransportSecurity ausprobieren.

Dann müssen Sie nur noch hinzufügen

app.UseHttpsWithHsts(HttpsMode.AllowedRedirectForGet, configureRoutes: routeAction);

Dadurch wird auch der HTTP-StrictTransportSecurity-Header zu allen Anfragen hinzugefügt, die über das https-Schema erfolgen.

Beispielcode und Dokumentation https://github.com/saidout/saidout-aspnetcore-httpswithstricttransportsecurity#example-code

In IIS10 (Windows 10 und Server 2016) gibt es ab Version 1709 eine neue, einfachere Möglichkeit, HSTS für eine Website zu aktivieren.

Microsoft beschreibt die Vorteile des neuen Ansatzes Hier, und bieten viele verschiedene Beispiele dafür, wie die Änderung programmgesteuert oder durch direktes Bearbeiten der Datei ApplicationHost.config implementiert werden kann (die wie web.config ist, aber auf IIS-Ebene und nicht auf der Ebene einzelner Sites ausgeführt wird).ApplicationHost.config finden Sie unter C:\Windows\System32\inetsrv\config.

Ich habe hier zwei der Beispielmethoden beschrieben, um Linkfäule zu vermeiden.

Methode 1 - Bearbeiten Sie die Datei ApplicationHost.config direkt zwischen der <site> Tags, fügen Sie diese Zeile hinzu:

<hsts enabled="true" max-age="31536000" includeSubDomains="true" redirectHttpToHttps="true" />

Methode 2 - Befehlszeile:Führen Sie Folgendes an einer Eingabeaufforderung mit erhöhten Rechten aus (z. B.rechte Maustaste auf CMD und als Administrator ausführen).Denken Sie daran, Contoso durch den Namen Ihrer Site zu ersetzen, wie er im IIS-Manager angezeigt wird.

c:
cd C:\WINDOWS\system32\inetsrv\
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.enabled:True" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.max-age:31536000" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.includeSubDomains:True" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.redirectHttpToHttps:True" /commit:apphost

Die anderen Methoden, die Microsoft in diesen Artikeln anbietet, sind möglicherweise bessere Optionen, wenn Sie sich in einer gehosteten Umgebung befinden, auf die Sie nur eingeschränkten Zugriff haben.

Beachten Sie, dass die IIS10-Version 1709 jetzt für Windows 10 verfügbar ist, sich für Windows Server 2016 jedoch auf einem anderen Release-Track befindet und nicht als Patch oder Service Pack veröffentlicht wird.Sehen Hier für Einzelheiten zu 1709.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top