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

某些安全性较高的网页,如网上支付或用户登陆页面,可能会使用到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 1.0

转载于:https://www.cnblogs.com/snowdream/archive/2009/08/07/use-https-in-aspnet-mvc.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 `socket_set_option` 函数设置 SSL/TLS 加密通信需要先创建一个 SSL/TLS 上下文,然后将该上下文应用到 socket 上。具体的步骤如下: 1. 创建一个 SSL/TLS 上下文,可以使用 OpenSSL 库提供的函数进行创建,比如 `openssl_pkey_new`、`openssl_x509_read`、`openssl_pkcs12_read` 等。 2. 使用 `stream_context_create` 函数创建一个上下文,将 SSL/TLS 上下文作为参数传入。 3. 使用 `stream_socket_enable_crypto` 函数将 SSL/TLS 上下文应用到 socket 上,使其支持 SSL/TLS 加密通信。 下面是一个使用 `socket_set_option` 函数设置 SSL/TLS 加密通信的示例代码: ```php $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1); // 创建 SSL/TLS 上下文 $sslContext = stream_context_create(); stream_context_set_option($sslContext, 'ssl', 'local_cert', '/path/to/cert.pem'); stream_context_set_option($sslContext, 'ssl', 'local_pk', '/path/to/private/key.pem'); // 将 SSL/TLS 上下文应用到 socket 上 stream_socket_enable_crypto($server, true, STREAM_CRYPTO_METHOD_TLS_SERVER, $sslContext); ``` 在上面的示例代码,我们使用了 `stream_context_create` 函数创建了一个上下文 `$sslContext`,并使用 `stream_context_set_option` 函数设置了 SSL/TLS 上下文的相关参数,包括证书路径、私钥路径等。然后,我们使用 `stream_socket_enable_crypto` 函数将 SSL/TLS 上下文 `$sslContext` 应用到 socket `$server` 上,使其支持 SSL/TLS 加密通信。 需要注意的是,在使用 SSL/TLS 加密通信时,客户端和服务端都需要支持 SSL/TLS,否则无法建立加密通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值