在 ASP.NET MVC 中使用 HTTPS

來源:互聯網
上載者: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的連結,這些可以在實際使用時做適當的最佳化。

相關文章

Alibaba Cloud 10 Year Anniversary

With You, We are Shaping a Digital World, 2009-2019

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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