2009-07-13 35 views
16

Làm cách nào để xác định và buộc người dùng chỉ xem trang web của mình bằng HTTPS? Tôi biết nó có thể được thực hiện thông qua IIS, nhưng muốn biết làm thế nào nó thực hiện lập trình.C# Cách xác định xem HTTPS

+0

Như thế này: http://www.jameskovacs.com/blog/HowToAutoRedirectToASSLsecuredSiteInIIS.aspx –

Trả lời

20

Bạn có thể viết một HttpModule như thế này:

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

đâu {use SSL} là một số điều kiện xem có sử dụng SSL hay không.

EDIT: và, tất nhiên, đừng quên thêm một định nghĩa module để một 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

Hầu hết các ứng dụng web có một trang _global.asax_ mà cũng có thể bao gồm các mã tương tự như được chỉ ra bởi Alex. Chỉ cần cung cấp trình xử lý Application_BeginRequest – Rajiv

+0

Điều gì đã giúp tôi giải quyết vấn đề của tôi là Yêu cầu.IsSecureConnection, đảm bảo viết hoa Yêu cầu trong trường hợp này, trừ khi bạn tạo một yêu cầu có tên var như Alex đã làm. Chỉ là một thứ để ghi nhớ trong đầu. –

+1

Có một lưu ý nhỏ về điều này: Bạn phải tắt cấu hình chế độ tích hợp trong 'system.webServer' với thuộc tính' validateIntegratedModeConfiguration' của thẻ 'validation' được đặt thành' false' (xem [câu trả lời này] (http://stackoverflow.com)/a/4210026) để biết thêm chi tiết). Ngoài ra, nếu bạn muốn sử dụng IIS Express hoặc IIS 6, bạn nên lưu ý [câu trả lời này] (http://stackoverflow.com/a/963975) –

5

Bạn sẽ phải chuyển đổi này từ VB.NET sang C#, nhưng đây là những gì tôi sử dụng trong các trang web của mình:

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 

Đó là mã nhiều hơn một số kỹ thuật khác, nhưng có lý do. Phương thức này sẽ chỉ chuyển hướng khi nó không ở trong chế độ nó nên ở. Và khi nó thực hiện chuyển hướng, nó sẽ chuyển hướng 301 (vĩnh viễn). Lợi ích ở đây là các công cụ tìm kiếm sẽ thực hiện theo chuyển hướng 301 và điều đó sẽ ngăn chặn bất kỳ khả năng nào của chúng lập chỉ mục cùng một trang hai lần (ở chế độ http và https). Bạn có thể so sánh điều này với hành vi mặc định của Response.Redirect (chuyển hướng tạm thời 302) mà Google, ví dụ, không xử lý theo cùng một cách. Họ sẽ không thay đổi chỉ mục của họ dựa trên chuyển hướng tạm thời.

Vì vậy, nếu bạn đang ở trên một trang mà bạn muốn được mã hóa SSL, hãy gọi nó như thế này:

SetSSL (True)

Nếu không:

SetSSL (False)

Và nếu bạn thực sự cần điều này để được áp dụng trên toàn cầu, tôi sẽ gọi SetSSL (True) trong Application_BeginRequest của global.asax của bạn. Hãy coi chừng rằng SSL sẽ làm chậm mọi thứ xuống một chút. Vì lý do đó, tôi thường rất chọn lọc khi chuyển đổi giữa http và https. Thực tế, trong số hàng tá trang web tôi đã phát triển, chỉ có hai trang web sử dụng SSL trên toàn bộ trang web.

1

IIR bạn có thể kiểm tra theo yêu cầu (HttpContext.Current.Request) cho tên miền mà sau đó bạn có thể kiểm tra những gì giao thức đang được sử dụng (http, https, ftp, vv)

10

Một chút cứng mã hóa nhưng straighforward!

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

+1 một mô-đun http có vẻ như quá mức cần thiết ở đây nhưng tôi thích điều này bởi vì nó ngắn và ngọt ngào, cảm ơn. –

+1

đơn giản, ngắn gọn và hoạt động, – dvdmn

0

Bạn cũng có thể thiết lập quy tắc ghi lại trong web.config dưới thẻ system.webServer. ví dụ:

<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> 
Các vấn đề liên quan