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
risposta
È 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>
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
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. –
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) –
Questo articolo copre le richieste di spostamento dentro e fuori SSL. A volte non desideri che l'utente visualizzi una pagina in SSL perché brucia proc proc per le pagine che non devono essere protette.
http://weblogs.asp.net/kwarren/archive/2005/07/08/418541.aspx
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.
IIR è possibile controllare la richiesta (HttpContext.Current.Request) per il dominio che poi possibile controllare quale protocollo viene utilizzato (HTTP, HTTPS, FTP, ecc)
Un po 'difficile, ma codificato straighforward!
if (!HttpContext.Current.Request.IsSecureConnection)
{
Response.Redirect("https://www.foo.com/foo/");
}
+1 un modulo http sembra eccessivo, ma mi piace questo perché è breve e dolce, grazie. –
semplice, breve e funziona, – dvdmn
È 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>
Come questo: http://www.jameskovacs.com/blog/HowToAutoRedirectToASSLsecuredSiteInIIS.aspx –