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

iDotNetSpace發表於2009-08-07
某些安全性較高的網頁,如網上支付或使用者登陸頁面,可能會使用到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         /// 
 8         /// 重寫OnAuthorization方法
 9         /// 
10         /// 
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""",nullnull)


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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-611626/,如需轉載,請註明出處,否則將追究法律責任。

相關文章