2009-07-13 14 views
16

Jak określić i zmusić użytkowników do przeglądania mojej witryny tylko przy użyciu HTTPS? Wiem, że można to zrobić za pomocą IIS, ale chcę wiedzieć, jak to zrobić programowo.C# Jak ustalić, czy HTTPS

+0

Jak to: http://www.jameskovacs.com/blog/HowToAutoRedirectToASSLsecuredSiteInIIS.aspx –

Odpowiedz

20

Można napisać HttpModule takiego:

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

{use SSL} Gdzie jest jakiś warunek, czy używać SSL, czy nie.

EDIT, i, oczywiście, nie zapomnij dodać definicję modułu do 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

Większość aplikacji internetowych mieć stronę _global.asax_ które mogą również obejmować ten sam kod co wskazuje Alex. Wystarczy podać instrukcję obsługi Application_BeginRequest. – Rajiv

+0

Pomógł mi mój problem.IsSecureConnection, upewniając się, że w tym przypadku zostanie zamapowana duża liczba żądań, chyba że utworzysz żądanie o nazwie var, takie jak Alex. Tylko coś do zapamiętania. –

+1

Jest to drobna uwaga: Musisz wyłączyć konfigurację trybu zintegrowanego pod 'system.webServer' za pomocą atrybutu' validateIntegratedModeConfiguration' znacznika 'validation' ustawionego na' false' (patrz [ta odpowiedź] (http://stackoverflow.com/a/4210026) po więcej szczegółów). Ponadto, jeśli chcesz korzystać z usług IIS Express lub IIS 6, powinieneś zwrócić uwagę na [tę inną odpowiedź] (http://stackoverflow.com/a/963975) –

5

Trzeba przekonwertować to z VB.NET do C#, ale to jest co używam w moich stron:

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 

To więcej niż kod niektórych innych technik, ale nie ma powodu, dla niego. Ta metoda przekieruje tylko wtedy, gdy nie znajduje się w trybie, w którym powinna się znajdować. A kiedy wykonuje przekierowanie, dokonuje 301 przekierowania (stałego). Korzyścią jest to, że wyszukiwarki będą podążać za przekierowaniem 301, co uniemożliwi im dwukrotne indeksowanie tej samej strony (w trybie http i https). Można to porównać z domyślnym działaniem Response.Redirect (302 tymczasowe przekierowanie), którego Google na przykład nie traktuje w ten sam sposób. Nie zmienią oni swojego indeksu na podstawie tymczasowego przekierowania.

Więc jeśli jesteś na stronie, którą chcesz być SSL szyfrowane, nazwać tak:

SetSSL (True)

Inaczej:

SetSSL (fałsz)

A jeśli naprawdę potrzebujesz tego do globalnego zastosowania, nazwałbym SetSSL (True) w Application_BeginRequest twojego global.asax. Uważaj, że protokół SSL nieco spowolni. Z tego powodu zazwyczaj przełączam się między http i https. W rzeczywistości, spośród kilkudziesięciu opracowanych przeze mnie witryn, tylko dwie używały SSL w całej witrynie.

1

IIR można sprawdzić żądanie (HttpContext.Current.Request) dla domeny, która następnie może sprawdzić, co jest używany protokół (HTTP, HTTPS, FTP, etc)

10

Trochę zakodowanego ale straighforward!

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

+1 moduł http wygląda jak przesada tutaj, ale podoba mi się to bo to krótkie i słodkie, dzięki. –

+1

prosty, krótki i działa, – dvdmn

0

Można również skonfigurować reguły przepisywania w web.config pod tagiem system.webServer. np:

<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> 
Powiązane problemy