2016-08-29 27 views
0

我試圖在我的網站的選定頁面上實現HTTPS。使用屬性RequireHttps適用,但會導致測試問題,因爲我們沒有在本地安裝證書。要求https和派生自RequireHttpsAttribute

我正在尋找的解決方案將需要忽略本地主機,並忽略一臺測試服務器,同時在我們的第二臺測試服務器上工作,我們在那裏有一個證書。

這方面的一些進一步的背景。目的是將網站逐漸遷移到https。這是一個電子商務網站,所以顯然部分已經是安全的,我知道,由於很多原因,將整個網站移到安全地點是件好事。我也知道,一旦你從頁面A移動到頁面B,其中B是安全的,那麼當你移回到A時,它不會回到HTTP,這很好。 我想分階段移動網站,以防萬一內容不匹配,網站地圖,搜索引擎優化,谷歌排名等問題。

一些我嘗試過的各種解決方案 - 我已經實現了派生類從RequireHttps屬性如下:

public class CustomRequireHttps : RequireHttpsAttribute 
{ 
    protected override void HandleNonHttpsRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.Url != null && (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase) 
                   && !String.Equals(filterContext.HttpContext.Request.HttpMethod, "HEAD", StringComparison.OrdinalIgnoreCase) 
                   && !filterContext.HttpContext.Request.Url.Host.Contains("localhost") 
                   && !filterContext.HttpContext.Request.Url.Host.Contains("testing"))) 
     { 
      base.HandleNonHttpsRequest(filterContext); 
     } 
    } 
} 

並已申請此屬性來一個頁面,但按預期並未奏效,它要麼適用HTTPS的網站上的所有頁面或完全不工作。

我也試過這個解決方案工作,但只在本地主機上,而不是兩個測試服務器上:

#if !DEBUG 
[RequireHttps] 
#endif 

然後我試圖重寫,像這樣的OnAuthorizartion方法:

public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     if (filterContext.HttpContext != null && filterContext.HttpContext.Request.IsLocal) 
     { 
      return; 
     } 

     base.OnAuthorization(filterContext); 
    } 

它的工作但是一旦我將它帶到服務器上並突然顯示測試證書,每個頁面都是HTTPS,我不明白這一點,因爲我只在一個頁面上使用了此派生屬性。

所以,我期望實現的是在我的網站上選定的頁面上實現HTTPS。在本地主機和第一臺測試服務器上需要忽略此HTTPS請求,但需要在具有證書的第二臺測試服務器上忽略NOT

到目前爲止,它要麼根本不工作,要麼在網站上的每個頁面上。

但是,這就是踢球者,如果我使用RequireHttps屬性,它可以在第二臺測試服務器上完美工作,但會在沒有證書的所有服務器上導致問題。 「完美地工作」是指它僅在我使用該屬性的頁面上實現HTTPS,並且不會突然切換所有頁面以確保安全。

任何想法我在做什麼錯在這裏?

回答

0

可能有很多事情要做,例如,當您的鏈接是本地的,當切換到HTTPS時,所有頁面都是HTTPS(不適用,要求HTTPS不會切換回HTTP)。從安全角度來看,您需要爲HTTPS的所有頁面提供頁面子集(否則,您可能會通過未加密的HTTP共享安全cookie /登錄令牌)。所以可能你的屬性被應用了,所有後續的請求都通過SSL提供服務。

其次,在本地主機請求uri上測試將在第二臺服務器上通過HTTP提供頁面。我想解決這個問題的意見是,如果頁面應該通過HTTPS提供,請在web.config中創建一個交換機。在您的全局過濾器配置中檢查此開關:

public static class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     var useSsl = Convert.ToBoolean(ConfigurationManager.AppSettings["useSsl"]); 
     if (useSsl) 
     { 
      filters.Add(new RequireHttpsAttribute()); 
     } 
    } 
} 
+0

這是我們當前系統的工作方式,除了不允許選擇性實現HTTPS外,這是正常的。我意識到,一旦你在一個安全的連接,它不會切換回來,那很好。這裏的目標是最終將整個站點遷移到HTTPS,但要在整個階段完成。所以,當你去結帳的時候顯然是安全的,但我還想添加一兩個安全的頁面。如果他們沒有問題,那麼再移動一兩個....等等。 –