2009-07-13 15 views
16

Wie kann ich Benutzer bestimmen und zwingen, meine Website nur mit HTTPS anzuzeigen? Ich weiß, dass es über IIS getan werden kann, aber wissen möchte, wie es programmgesteuert gemacht wird.C# So ermitteln Sie, ob HTTPS

+0

So: http://www.jameskovacs.com/blog/HowToAutoRedirectToASSLsecuredSiteInIIS.aspx –

Antwort

20

Sie können einen HttpModule so schreiben.

EDIT: und natürlich, nicht vergessen eine Moduldefinition zu einem web.config hinzuzufügen:

<system.web> 
    <httpModules> 
     <!--Used to redirect all the unsecure connections to the secure ones if necessary--> 
     <add name="Security" type="{YourNamespace}.Handlers.SecurityModule, {YourAssembly}" /> 
     ... 
    </httpModules> 
</system.web> 
+0

Die meisten Web-Anwendungen haben eine _global.asax_ Seite, die auch den gleichen Code enthält, wie von Alex angegeben. Geben Sie einfach den Handler Application_BeginRequest an. – Rajiv

+0

Was mir bei meinem Problem geholfen hat, war Request.IsSecureConnection, stellen Sie sicher, dass die Anfrage in diesem Fall großgeschrieben wird, es sei denn, Sie erstellen eine var-definierte Anfrage wie Alex. Nur etwas, das man im Kopf behalten sollte. –

+1

Es gibt eine kleinere Anmerkung zu diesem: Sie müssen die integrierte Moduskonfiguration unter 'system.webServer' deaktivieren, wobei das' validateIntegratedModeConfiguration'-Attribut des 'validation'-Attributs auf' false' gesetzt ist (siehe [diese Antwort] (http://stackoverflow.com)/a/4210026) für weitere Details). Außerdem, wenn Sie IIS Express oder IIS 6 verwenden möchten, sollten Sie [diese andere Antwort] (http://stackoverflow.com/a/963975) notieren –

2

Dieser Artikel behandelt das Verschieben von Anforderungen innerhalb und außerhalb von SSL. Manchmal möchten Sie nicht, dass der Benutzer eine Seite in SSL anzeigt, weil er proc-Zyklen für Seiten verbrennt, die nicht gesichert werden müssen.

/// <summary> 
/// Used to correct non-secure requests to secure ones. 
/// If the website backend requires of SSL use, the whole requests 
/// should be secure. 
/// </summary> 
public class SecurityModule : IHttpModule 
{ 
    public void Dispose() { } 

    public void Init(HttpApplication application) 
    { 
     application.BeginRequest += new EventHandler(application_BeginRequest); 
    } 

    protected void application_BeginRequest(object sender, EventArgs e) 
    { 
     HttpApplication application = ((HttpApplication)(sender)); 
     HttpRequest request = application.Request; 
     HttpResponse response = application.Response; 

     // if the secure connection is required for backend and the current 
     // request doesn't use SSL, redirecting the request to be secure 
     if ({use SSL} && !request.IsSecureConnection) 
     { 
      string absoluteUri = request.Url.AbsoluteUri; 
      response.Redirect(absoluteUri.Replace("http://", "https://"), true); 
     } 
    } 
} 

Wo {use SSL} eine bestimmte Bedingung ist, ob die Verwendung von SSL oder nicht:

http://weblogs.asp.net/kwarren/archive/2005/07/08/418541.aspx

5

Sie würden diese von VB.NET auf C# konvertieren, aber das ist was ich in meinen Websites verwenden:

Imports System.Web.HttpContext 

Public Shared Sub SetSSL(Optional ByVal bEnable As Boolean = False) 
    If bEnable Then 
    If Not Current.Request.IsSecureConnection Then 
     Dim strHTTPS As String = "https://www.mysite.com" 
     Current.Response.Clear() 
     Current.Response.Status = "301 Moved Permanently" 
     Current.Response.AddHeader("Location", strHTTPS & Current.Request.RawUrl) 
     Current.Response.End() 
    End If 
    Else 
    If Current.Request.IsSecureConnection Then 
     Dim strHTTP As String = "http://www.mysite.com" 
     Current.Response.Clear() 
     Current.Response.Status = "301 Moved Permanently" 
     Current.Response.AddHeader("Location", strHTTP & Current.Request.RawUrl) 
     Current.Response.End() 
    End If 
    End If 
End Sub 

es ist mehr Code als einige der anderen Techniken, aber es gibt einen Grund dafür. Diese Methode wird nur umgeleitet, wenn sie nicht in dem Modus ist, in dem sie sein sollte. Und wenn sie eine Umleitung ausführt, führt sie eine 301 (permanente) Umleitung durch. Der Vorteil besteht darin, dass Suchmaschinen der 301-Umleitung folgen und somit verhindern, dass sie dieselbe Seite zweimal indexieren (im HTTP- und HTTPS-Modus). Sie können dies mit dem Standardverhalten von Response.Redirect (302 temporäre Weiterleitung) vergleichen, das Google zum Beispiel nicht auf die gleiche Weise behandelt. Sie ändern ihren Index nicht basierend auf einer temporären Weiterleitung.

Also, wenn Sie auf einer Seite sind, die Sie möchten SSL-verschlüsselt sein, es so nennen:

SetSSL (True)

Ansonsten:

SetSSL (False)

Und wenn Sie wirklich benötigen, dass dies global angewendet wird, würde ich SetSSL (True) in der Application_BeginRequest Ihrer global.asax aufrufen. Seien Sie vorsichtig, dass SSL die Dinge ein wenig verlangsamen wird. Aus diesem Grund bin ich typischerweise sehr selektiv, wenn ich zwischen http und https wechsle. Aus Dutzenden von Websites, die ich entwickelt habe, gibt es nur zwei, die SSL auf der gesamten Website verwenden.

1

IIR können Sie die Anforderung überprüfen (HttpContext.Current.Request) für die Domäne, die Sie dann überprüfen, welches Protokoll verwendet wird (http, https, ftp, etc.)

10

Ein bisschen hart codiert aber straighforward!

if (!HttpContext.Current.Request.IsSecureConnection) 
{ 
    Response.Redirect("https://www.foo.com/foo/"); 
} 
+1

+1 ein HTTP-Modul scheint hier wie Overkill, aber ich mag dies weil es kurz und gut, danke. –

+1

einfach, kurz und funktioniert, – dvdmn

0

Sie können auch eine Rewrite-Regel in Ihrer web.config unter dem system.webServer-Tag einrichten. zB:

<rewrite> 
     <rules> 
     <rule name="Redirect to HTTPS" stopProcessing="true"> 
      <match url="(.*)" /> 
      <conditions> 
      <add input="{HTTP_HOST}" matchType="Pattern" pattern="^localhost(:\d+)?$" negate="true" ignoreCase="true" /> 
      <add input="{HTTP_HOST}" matchType="Pattern" pattern="^127\.0\.0\.1(:\d+)?$" negate="true" /> 
      <add input="{HTTPS}" pattern="off" /> 
      </conditions> 
      <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" /> 
     </rule> 
     </rules> 
    </rewrite> 
Verwandte Themen