某些安全性較高的網頁,如網上支付或使用者登陸頁面,可能會使用到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>
5
HttpsPort可以不寫,將使用預設的443。
然後在要使用https串連的controller或action前加上[RequireHttps],如
1 [RequireHttps]
2 public ActionResult About()
3 {
4 return View();
5 }
6
這樣,當我們用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