Asp.Net 中 HTTP 和 HTTPS 切換


目的

  • HTTP,超文本傳輸協議,明文傳輸,無狀態,服務器默認端口80
  • HTTPS,具有SSL加密的HTTP,加密傳輸,需要申請ca證書,服務器默認端口443

雖然現在推行全站https協議,但是httpshttp更耗費資源,所以一部分網站還是實行部分http,一部分https,本文講的就是如何在Asp.Net MVC項目中實現httphttps的切換

步驟

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.調試項目,即可驗證是否完成對httphttps的控制.

5.發布應用,部署到IIS上的時候一個項目記得要綁定兩個域名,分別為httphttps.

參考資料

-超文本傳輸安全協議

-C# 特性(Attribute)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM