在一個網站內,某些網頁需要跑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: }
文章標籤
全站熱搜
