在 ASP.NET MVC 中使用 HTTPS (SSL/TLS)
我們先實現強制一個action使用https。這裡寫了一個RequireHttpsAttribute,它的作用是將非https連線轉換成https連線,這樣所有使用了RequireHttps這個filter的controller都會強制使用https連線。
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節加入如下資訊即可
2 <add key="HostName" value="localhost"/>
3 <add key="httpsPort" value="443"/>
4 appSettings>
5
HttpsPort可以不寫,將使用預設的443。
然後在要使用https連線的controller或action前加上[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。原來是
我們對其進行改寫
這樣,生成出來的連結就是https的了,點選以後直接會使用https連線而無需再進行一次Redirect,之後新的要到https頁面的連結也可仿照次寫法。
這裡又要用到hostName資訊,我們之前已經將它寫在web.config裡了,所以可以專門寫一個方法來獲取web.config中的這部分資訊並拼接成這裡需要的hostName字串,或者還可以對HtmlHelper寫一個擴充套件方法專門用於處理https的連結,這些可以在實際使用時做適當的優化。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-611626/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [HTTPS]SSL/TLSHTTPTLS
- 聊聊HTTPS和SSL/TLS協議HTTPTLS協議
- ASP.NET Core Kestrel 中使用 HTTPS (SSL)ASP.NETHTTP
- 在Linux中,如何管理SSL/TLS證書?LinuxTLS
- SSL,TLSTLS
- [SSL/TLS] SSL/TLS協議綜合總結TLS協議
- https與TLS/SSL 握手協議、record protocol簡介HTTPTLS協議Protocol
- HTTPS協議詳解(四):TLS/SSL握手過程HTTP協議TLS
- SSL/TLS協議安全系列:SSL/TLS概述TLS協議
- Https、SSL/TLS相關知識及wireShark抓包分析HTTPTLS
- 在 ASP.NET Core 中禁用HTTPSASP.NETHTTP
- 完全吃透 TLS/SSLTLS
- 淺談 HTTPS 和 SSL/TLS 協議的背景與基礎HTTPTLS協議
- ASP.NET MVC中簡單使用AutofacASP.NETMVC
- Akka-CQRS(13)- SSL/TLS for gRPC and HTTPS:自簽名證書產生和使用TLSRPCHTTP
- HTTPS、SSL、TLS三者之間的聯絡和區別HTTPTLS
- 《HTTPS權威指南》- SSL、TLS和密碼學學習筆記HTTPTLS密碼學筆記
- SSL和TLS 區別TLS
- SSL與TLS協議TLS協議
- 聊一聊 TLS/SSLTLS
- Secure gRPC with TLS/SSLRPCTLS
- SSL/TLS 深入淺出TLS
- 【轉】在ASP.NET MVC中,使用Bundle來打包壓縮js和cssASP.NETMVCJSCSS
- Nginx使用SSL模組配置httpsNginxHTTP
- https/tcp ssh/tlsHTTPTCPTLS
- 在Asp.net MVC中訪問靜態頁面ASP.NETMVC
- 關於TLS/SSL協議TLS協議
- SSL/TLS協議詳解TLS協議
- 在ASP.NET Core MVC 2.2 中使用AutoMapperASP.NETMVCAPP
- 在 ASP.NET MVC 中使用帶字尾的 URLASP.NETMVC
- Asp.Net MVC 使用 AjaxASP.NETMVC
- nginx使用ssl模組配置HTTPS支援NginxHTTP
- 在Docker容器中執行ASP.NET MVC應用程式DockerASP.NETMVC
- 在 Asp.NET MVC 中使用 SignalR 實現推送功能ASP.NETMVCSignalR
- SSL/TLS協議安全系列- SSL中間人攻擊防範方案概述TLS協議
- Asp.net MVC中ViewData與ViewBag的使用方法ASP.NETMVCView
- SSL/TLS 握手過程詳解TLS
- TLS與SSL之間關係TLS