在 ASP.NET MVC 中使用 HTTPS (SSL/TLS)
2015-02-27 10:24
288 查看
http://www.cnblogs.com/Blink_Star/archive/2009/08/07/1541553.html
某些安全性较高的网页,如网上支付或用户登陆页面,可能会使用到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>
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", "",null, null)
这样,生成出来的链接就是https的了,点击以后直接会使用https连接而无需再进行一次Redirect,之后新的要到https页面的链接也可仿照次写法。
这里又要用到hostName信息,我们之前已经将它写在web.config里了,所以可以专门写一个方法来获取web.config中的这部分信息并拼接成这里需要的hostName字符串,或者还可以对HtmlHelper写一个扩展方法专门用于处理https的链接,这些可以在实际使用时做适当的优化。
示例代码下载
补充材料:
HTTPS 简介
SSL 简介
如何在 IIS 中设置 HTTPS 服务
Internet 信息服务 (IIS) 服务器证书安装说明
某些安全性较高的网页,如网上支付或用户登陆页面,可能会使用到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>
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", "",null, null)
这样,生成出来的链接就是https的了,点击以后直接会使用https连接而无需再进行一次Redirect,之后新的要到https页面的链接也可仿照次写法。
这里又要用到hostName信息,我们之前已经将它写在web.config里了,所以可以专门写一个方法来获取web.config中的这部分信息并拼接成这里需要的hostName字符串,或者还可以对HtmlHelper写一个扩展方法专门用于处理https的链接,这些可以在实际使用时做适当的优化。
示例代码下载
补充材料:
HTTPS 简介
SSL 简介
如何在 IIS 中设置 HTTPS 服务
Internet 信息服务 (IIS) 服务器证书安装说明
相关文章推荐
- 在 ASP.NET MVC 中使用 HTTPS (SSL/TLS)
- 在 ASP.NET MVC 中使用 HTTPS (SSL/TLS)
- 在 ASP.NET MVC 中使用 HTTPS (SSL/TLS) -- 学习
- 在 ASP.NET MVC 中使用 HTTPS (SSL/TLS)
- ASP.NET Core Kestrel 中使用 HTTPS (SSL)
- ASP.NET Core Kestrel 中使用 HTTPS (SSL)
- ASP.NET Core Kestrel 中使用 HTTPS (SSL)
- ASP.NET Core Kestrel 中使用 HTTPS (SSL)
- ASP.NET Core Kestrel 中使用 HTTPS (SSL)
- ASP.NET Core Kestrel 中使用 HTTPS (SSL)
- [翻译]ASP.NET MVC Tip #39 – 在ASP.NET MVC中使用分布式缓存
- 在Asp.net Mvc Preview 4中使用AjaxHelper
- Asp.net Mvc 的积木,谈Asp.net MVC中视图逻辑模块化和controller组件的使用方法
- Asp.net2005 使用 NVelocity 实现 MVC
- 在Asp.net MVC中使用Asp.net Ajax
- 【翻译】使用ASP.NET MVC 和LINQ建立一个简单的博客 - Part 3
- (一) 在VSTS2008中文版下使用ASP.NET MVC
- [翻译] 使用ASP.NET MVC操作过滤器记录日志
- 【翻译】使用ASP.NET MVC 和 LINQ 创建一个Blog引擎实例-第一节
- Asp.net Mvc中MVCContrib中无法使用Castle的发解决方案