在 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

相关文章
相关标签/搜索