在一個網站內,某些網頁需要跑SSL,但是又不希望全站通通跑SSL,因為這樣會讓全站的效能很差,
遇到的客戶需求就是,只有在使用者有傳送個資的網頁就一定要是跑SSL,其他都不給跑SSL
所以要先整理出來一份要跑SSL的 Action Name清單,


例如:

   1:    List<string> SSLUnit = new List<string>();
   2:    SSLUnit.Add("Login");
   3:    SSLUnit.Add("SignUp");
   4:    SSLUnit.Add("SendMail");


注意SSL Action清單必須要加入被Ajax呼叫的Action 因為SSL網頁Ajax不能呼叫非SSL的Action,反之同,
總之就是不能混和呼叫.


然後在Action獲知目前正要跑的Action名稱

   1:  
   2:  
   3:  
   4: public override void OnActionExecuting(ActionExecutingContext filterContext)
   5:  {
   6:  var action = (string)filterContext.RouteData.Values["action"];
   7: …….
   8: base.OnActionExecuting(filterContext);
   9:  
  10: }


當Action是需要跑SSL(比對清單),但是目前的連線卻不是SSL,強制轉成SSL,
將網址的開頭從 http:// 轉成 https://


反之,當這個Action不需要跑SSL,也就不在清單內,而連線卻是SSL,則轉回非SSL
將網址的開頭從 https:// 轉成 http://

 

注意,如果不是ChildAction 才來做http與https互轉,避免有子母Action混合載入http與https的情形,

這樣會引發錯誤,也就是ChildrenAction只要母Action是SSL就跟著SSL,反之,不是SSL就還是維持不是SSL

   1: if (!filterContext.IsChildAction) //只有母Action才來做比對跟轉換
   2: {
   3:  
   4:  
   5:        if (!filterContext.HttpContext.Request.IsSecureConnection && SSLUnit.Contains(action))   //如果不是SSL連線而此action是在SSL清單內 轉址https
   6:          {
   7:  
   8:              var url = filterContext.HttpContext.Request.Url.ToString().Replace("http:", "https:");
   9:                filterContext.Result = new RedirectResult(url);
  10:                return;
  11:  
  12:           }
  13:  
  14:         if (filterContext.HttpContext.Request.IsSecureConnection && !SSLUnit.Contains(action))  //如果是SSL連線而此action1不在SSL清單內 轉址http
  15:           {
  16:  
  17:            var url = filterContext.HttpContext.Request.Url.ToString().Replace("https:", "http:");
  18:              filterContext.Result = new RedirectResult(url);
  19:             return;
  20:  
  21:          }  
  22: }

 

但是當在本機開發時,網址的開頭會是 http://localhost:1234/ 
如果Visual Studio是設定可以跑此專案可以跑SSL,則SSL的網址開頭會像是這樣,
https://localhost:54321/ 


此時就不能只有單純轉http與https 因為字串中會包含port,所以又要加一層判斷是否為 Local 開發

   1:  
   2:  
   3:  
   4: if (!filterContext.HttpContext.Request.IsLocal)  //非本機開發直接置換https字串
   5: {
   6:       var url = filterContext.HttpContext.Request.Url.ToString().Replace("http:", "https:");
   7:       filterContext.Result = new RedirectResult(url);
   8:       return;
   9:   }
  10:   else
  11:   {
  12:       var url = filterContext.HttpContext.Request.Url.ToString().Replace(“http://localhost:1234” "https://localhost:54321");
  13:       filterContext.Result = new RedirectResult(url);
  14:       return;
  15:   }
文章標籤
全站熱搜
創作者介紹
創作者 baechang 的頭像
baechang

翁百璋與大泡泡的奇幻旅程

baechang 發表在 痞客邦 留言(0) 人氣(559)