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

某些安全性較高的網頁,如網上支付或用戶登錄頁面,可能會使用到https(SSL/TLS)來提升安全性。本文介紹瞭如何在ASP.NET MVC中強制某action使用https和如何進行向https頁面的跳轉。
咱們先實現強制一個action使用https。這裏寫了一個RequireHttpsAttribute,它的做用是將非https鏈接轉換成https鏈接,這樣全部使用了RequireHttps這個filter的controller都會強制使用https鏈接。
 web

 
 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],如

app

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。原來是

ide

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的連接,這些能夠在實際使用時作適當的優化。

示例代碼下載ui

相關文章
相關標籤/搜索