在 ASP.NET MVC 中使用 HTTPS (SSL/TLS)

來源:互聯網
上載者:User
某些安全性較高的網頁,如網上支付或使用者登陸頁面,可能會使用到https(SSL/TLS)來提高安全性。本文介紹了如何在ASP.NET MVC中強制某action使用https和如何進行向https頁面的跳轉。
我們先實現強制一個action使用https。這裡寫了一個RequireHttpsAttribute,它的作用是將非https串連轉換成https串連,這樣所有使用了RequireHttps這個filter的controller都會強制使用https串連。

 

 1 using System.Web.Mvc;
 2 
 3 namespace Snowdream.Demo.RequireHttps
 4 {
 5     public class RequireHttpsAttribute:AuthorizeAttribute
 6     {
 7         /// <summary>
 8         /// 重寫OnAuthorization方法
 9         /// </summary>
10         /// <param name="filterContext"></param>
11         public override void OnAuthorization(AuthorizationContext filterContext)
12         {
13             // 如果已經是https串連則不處理,否則重新導向到https串連
14             if (!filterContext.HttpContext.Request.IsSecureConnection)
15             {
16                 // 擷取當前請求的Path
17                 string path = filterContext.HttpContext.Request.Path;
18 
19                 // 從web.config中擷取host,也可以直接從httpContext中擷取
20                 string host = System.Configuration.ConfigurationManager.AppSettings["HostName"];
21 
22                 // 從web.config中擷取https的連接埠
23                 string port = System.Configuration.ConfigurationManager.AppSettings["HttpsPort"];
24 
25                 // 如果連接埠號碼為空白表示使用預設連接埠,否則將host寫成host:port的形式
26                 if (port != null)
27                 {
28                     host = string.Format("{0}:{1}", host, port);
29                 }
30 
31                 // 重新導向到https串連
32                 filterContext.HttpContext.Response.Redirect(string.Format("https://{0}{1}", host, path));
33             }
34         }
35     }
36 }
37 

由於https和https服務使用不同的連接埠號碼,而且https不能綁定主機頭,只能通過不同連接埠的方式來區分各個網站,所以這裡將host和port資訊寫到了web.config裡,以方便配置。在web.config的appsettings節加入如下資訊即可

1 <appSettings>
2     <add key="HostName" value="localhost"/>
3     <add key="httpsPort" value="443"/>
4 </appSettings>

HttpsPort可以不寫,將使用預設的443。
然後在要使用https串連的controller或action前加上[RequireHttps],如

1 [RequireHttps]
2 public ActionResult About()
3 {
4     return View();
5 }

這樣,當我們用http://localhost/Home/About訪問該頁面時會自動跳到https://localhost/Home/About。但是這樣還有一個問題,網頁中的連結都是http的,當點擊進入需要使用https串連的網頁時都要進行一次Redirect。所以我們要將網頁中的連結也改成https。這步不難,只需要將view中所有連結到https頁面的Html.Action()使用適當的重載方法來寫即可。ASP.NET MVC 1.0 RTM中提供了2種重載可以將protocol設定為https。在建立ASP.NET MVC Web Application後預設產生的網站中,shared檔案夾下有site.master檔案中有個指向/Home/About的ActionLink。原來是

1 Html.ActionLink("Home", "Index", "Home")

我們對其進行改寫

1 Html.ActionLink("About", "About", "Home", "https", "localhost", "",null, null)

這樣,產生出來的連結就是https的了,點擊以後直接會使用https串連而無需再進行一次Redirect,之後新的要到https頁面的連結也可仿照次寫法。
這裡又要用到hostName資訊,我們之前已經將它寫在web.config裡了,所以可以專門寫一個方法來擷取web.config中的這部分資訊並拼接成這裡需要的hostName字串,或者還可以對HtmlHelper寫一個擴充方法專門用於處理https的連結,這些可以在實際使用時做適當的最佳化。

範例程式碼下載

補充材料:

HTTPS 簡介
SSL 簡介
如何在 IIS 中設定 HTTPS 服務
Internet 資訊服務 (IIS) 伺服器憑證安裝說明

本文適用於 ASP.NET MVC 1.0

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.