2009-07-13 1 views
16

Come determinare e obbligare gli utenti a visualizzare il mio sito Web utilizzando solo HTTPS? So che può essere fatto tramite IIS, ma voglio sapere come è fatto a livello di programmazione.C# Come determinare se HTTPS

+0

Come questo: http://www.jameskovacs.com/blog/HowToAutoRedirectToASSLsecuredSiteInIIS.aspx –

risposta

20

È possibile scrivere un HttpModule come questo:

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

Dove {use SSL} è una qualche condizione se utilizzare SSL o meno.

EDIT: e, naturalmente, non dimenticate di aggiungere una definizione del modulo per un web.config:

<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

maggior parte delle applicazioni web ha una pagina _global.asax_ che può anche includere lo stesso codice come indicato da Alex. Fornisci semplicemente l'handler Application_BeginRequest – Rajiv

+0

Ciò che mi ha aiutato con il mio problema è stato Request.IsSecureConnection, assicurandosi di capitalizzare la richiesta in questo caso, a meno che non si crei una richiesta denominata var come ha fatto Alex. Solo qualcosa da tenere a mente. –

+1

C'è una piccola nota a questo: Devi disabilitare la configurazione della modalità integrata sotto 'system.webServer' con l'attributo' validateIntegratedModeConfiguration' del tag 'validation' impostato su' false' (vedi [questa risposta] (http://stackoverflow.com)/a/4210026) per ulteriori dettagli). Inoltre, se si desidera utilizzare IIS Express o IIS 6 è necessario prendere nota di [questa altra risposta] (http://stackoverflow.com/a/963975) –

5

dovreste convertire questo da VB.NET a C#, ma questo è quello che uso nei miei siti:

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 

E 'più di codice rispetto ad alcune delle altre tecniche, ma c'è una ragione per questo. Questo metodo reindirizzerà solo quando non è nella modalità in cui dovrebbe essere. E quando esegue un reindirizzamento, esegue un reindirizzamento 301 (permanente). Il vantaggio è che i motori di ricerca seguiranno il reindirizzamento 301 e ciò impedirà qualsiasi possibilità di indicizzare la stessa pagina due volte (in modalità http e https). Puoi confrontarlo con il comportamento predefinito di Response.Redirect (302 reindirizzamenti temporanei) che Google, ad esempio, non tratta allo stesso modo. Non cambieranno il loro indice in base a un reindirizzamento temporaneo.

Quindi, se siete su una pagina che si desidera essere crittografato con SSL, chiamare in questo modo:

SetSSL (True)

Altrimenti:

SetSSL (Falso)

E se davvero avete bisogno che questo venga applicato a livello globale, chiamerei SetSSL (True) nella Application_BeginRequest del vostro global.asax. Fai attenzione che SSL rallenterà un po 'le cose. Per questo motivo sono generalmente molto selettivo quando si passa da http a https. In effetti, su dozzine di siti che ho sviluppato, ce ne sono stati solo due che utilizzano SSL in tutto il sito.

1

IIR è possibile controllare la richiesta (HttpContext.Current.Request) per il dominio che poi possibile controllare quale protocollo viene utilizzato (HTTP, HTTPS, FTP, ecc)

10

Un po 'difficile, ma codificato straighforward!

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

+1 un modulo http sembra eccessivo, ma mi piace questo perché è breve e dolce, grazie. –

+1

semplice, breve e funziona, – dvdmn

0

È inoltre possibile impostare una regola di riscrittura nel web.config sotto il tag system.webServer. ad esempio:

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