目的
HTTP
,超文本傳輸協議,明文傳輸,無狀態,服務器默認端口80
HTTPS
,具有SSL加密的HTTP,加密傳輸,需要申請ca證書,服務器默認端口443
雖然現在推行全站https
協議,但是https
比http
更耗費資源,所以一部分網站還是實行部分http
,一部分https
,本文講的就是如何在Asp.Net MVC
項目中實現http
和https
的切換
步驟
1.如果項目需求是全站https的話,只需在控制器前使用特性RequireHttpsAttribute
,他的文檔為表示一個特性,該特性用於強制通過 HTTPS 重新發送不安全的 HTTP 請求。
,就是所有請求都轉化為https鏈接.
2.如果我們要實現部分http,部分https,就要創建一個新的特性,使其繼承RequireHttpsAttribute
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Diagnostics;
namespace Https.Controllers.extends
{
public class SwitchHttpsAttribute : System.Web.Mvc.RequireHttpsAttribute
{
/// <summary>
/// 字段表示是否需要安全的https鏈接,默認不需要
/// </summary>
public bool RequireSecure = false;
/// <summary>
/// 重寫驗證方法,判斷是否需要https,如果需要https,就交給父類的方法處理,如果不需要,就自己處理
/// </summary>
/// <param name="filterContext"></param>
public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
{
if (RequireSecure)
{
//需要https,執行父類方法,轉化為https
base.OnAuthorization(filterContext);
}
else
{
//如果設置為非安全鏈接,即http,進入該區塊
//判斷鏈接,如果為https,這轉換為http
if (filterContext.HttpContext.Request.IsSecureConnection)
{
HandleNonHttpRequest(filterContext);
}
}
}
/// <summary>
/// 重寫處理鏈接方法,處理https請求,使其重定向http
/// </summary>
/// <param name="filterContext"></param>
protected virtual void HandleNonHttpRequest(AuthorizationContext filterContext)
{
if (String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
// 從web.config中獲取https的端口
string port =":"+ System.Configuration.ConfigurationManager.AppSettings["HttpPort"];
// redirect to HTTP version of page
string url = "http://" + filterContext.HttpContext.Request.Url.Host + port+ filterContext.HttpContext.Request.RawUrl;
//重定向
filterContext.Result = new RedirectResult(url);
}
}
}
}
2.http請求需要從web.config
中獲取端口,所以要添加配置,HostName
為可選,HttpPost
為該項目的端口.
<appSettings>
<add key="HostName" value="localhost"/>
<add key="HttpPort" value="8066"/>
</appSettings>
3.接下來可以在控制器中使用新的特性
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Https.Controllers.extends;
namespace Https.Controllers
{
public class HomeController : Controller
{
//[RequireHttps]
[SwitchHttps]
public ActionResult Index()
{
return View();
}
//[RequireHttps]
[SwitchHttps(RequireSecure = true)]
public ActionResult About()
{
return View();
}
}
}
4.調試項目,即可驗證是否完成對http
和https
的控制.
5.發布應用,部署到IIS上的時候一個項目記得要綁定兩個域名,分別為http
和https
.