2009-03-26 6 views

Antwort

9

Dies würde im Allgemeinen über IIS-Konfiguration oder mit einem ISAPI-Filter behandelt werden, aber wenn Sie es im Anwendungscode tun mögen, können Sie so etwas wie dies in der Page_Init Veranstaltung Ihrer Masterseite setzen ...

If Not Request.IsSecure 
    Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://")) 
End If 
+2

Nicht die besten Ideen. Sie führen eine clientseitige Umleitung zurück zur aufrufenden Seite. Wenn es aus irgendeinem Grund kein SSL gibt (kein Zertifikat oder schlechtes Zertifikat), gehen Sie in eine rekursive Schleife. Eine bessere Wahl wäre es, auf eine Fehlerseite umzuleiten, da der Benutzer keine sichere Seite/Seite eingeben sollte, es sei denn, der Code tut dies fälschlicherweise oder sie machen sich mit der URL herumärgern. –

+1

Das funktioniert gut mit der Einschränkung, dass die Methode string.replace alle Vorkommen von "http: //" zu "https: //" ändert, nicht nur das ursprüngliche Schema. I.e. Dies kann die Abfragezeichenfolgenparameter beeinträchtigen. –

+0

@Daniel Wenn Sie die: oder/Zeichen in Ihren Abfragezeichenfolgen haben, werden Sie andere Probleme haben;) –

2

Ich würde einfach alle HTTP-URLs auf https mit einer separaten Seite umleiten oder die Option "require secure channel" in Ihrer IIS-Konfiguration verwenden, die einen Fehler anzeigt, wenn jemand versucht, auf eine Nicht-HTTPS-Seite zuzugreifen.

Here's eine Website mit einem Leitfaden zum Weiterleiten der Fehlerseite an die https-URL Ihrer Website.

+0

Dies ist auf Web-Server-Ebene bei weitem die beste Wahl. Es bietet größere Flexibilität auf der Straße, wenn Sie besonders SSL-Load-Balancing-Hardware einführen. –

0
if(!String.Equals(Request.Url.Scheme, 
        "https", 
        StringComparison.OrdinalIgnoreCase)) { } 
+0

Dies ist eine schreibgeschützte Eigenschaft - siehe http://msdn.microsoft.com/en-us/library/system.uri.scheme.aspx – Rich

+0

Ja, ist es. Es ist OK für String-Vergleich, nicht wahr? – abatishchev

+0

Ja, und es sieht so aus, als ob deine Antwort bearbeitet wurde, um das zu reflektieren. Ich hatte nur kommentiert, weil der erste Beitrag es schien, dass Sie das Schema von http "zu" https "programmatisch ändern konnten. – Rich

0

Wenn Sie nur sichere Verbindungen annehmen möchten, einen separaten Service für Port 80, dass nur Umleitungen an HTTPS erstellen. Im Idealfall würden Sie den angeforderten Pfad in der HTTP-Umleitung beibehalten.

Wenn Sie einfach nur HTTPS-Verbindungen für den Browser fördern wollen (und kümmern sich nicht um Roboter, zum Beispiel), fügen Sie diese auf Ihre Seiten:

<script type="text/javascript"> 
if(location.protocol=='http:') 
    location=location.toString().replace(/^http:/,'https:'); 
</script> 
1

Ich habe dies getan, mit einem Httpmodule, so dass Sie Sie müssen sich nicht darum kümmern, den Code in jede Masterseite einzufügen (wenn Sie mehrere haben). Diese Version deaktiviert auch die Weiterleitung für localhost, so dass Sie kein SSL auf Ihrem eigenen Computer haben müssen. Im Grunde machen Sie eine neue HTTP-Modul wie folgt aus:

Public Class RedirectToHttpsModule 
    Implements IHttpModule 

    Public Sub Dispose() Implements IHttpModule.Dispose 

    End Sub 

    Public Sub Init(ByVal context As HttpApplication) Implements IHttpModule.Init 
     AddHandler context.BeginRequest, AddressOf context_BeginRequest 
    End Sub 

    Private Sub context_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) 
     Dim application As HttpApplication = TryCast(sender, HttpApplication) 
     If Not application.Request.IsSecureConnection And Not application.Request.IsLocal Then 
      application.Response.Redirect(application.Request.Url.ToString().Replace(application.Request.Url.Scheme, "https")) 
     End If 
    End Sub 

End Class 

Sie müssen auch die entsprechende Zeile in der Datei web.config für die Httpmodule hinzufügen:

<httpModules> 
     <add type="RedirectToHttpsModule" name="RedirectToHttpsModule" /> 
</httpModules> 
2

Die folgende baut auf Josh Stodolas Antwort (IsSecureConnection) aber verwendet die UriBuilder, um das Schema zu https anstelle einer Zeichenfolge zu ersetzen. Der Vorteil dieses Ansatzes besteht darin, dass nicht alle Vorkommen von "http" in der URL zu "https" geändert werden.

if (!Request.IsSecureConnection) 
{ 
    UriBuilder newUri = new UriBuilder(Request.Url); 
    newUri.Scheme = Uri.UriSchemeHttps; 
    Response.Redirect(newUri.Uri.AbsoluteUri); 
} 
Verwandte Themen