2011-12-22 57 views
1

我有一個網站需要使用SSL進行保護。我如何設置一個路由或IIS配置,自動發送非SSL協議接收到的任何請求到SSL協議?這是否可以作爲路由規則來處理,或者最好是僅在主控制器上使用RequireHttps屬性,而不是在控制器本身上使用,並且在Index()方法中檢測協議?MVC3:如何將非SSL請求自動路由到SSL協議?

作爲說明:我讀this question,它使用UrlRewriting和IIS7的應用程序請求路由,但我堅持與IIS6和UrlRewriting不是我的選項。

+0

不要依賴於自動重定向太多來自'HTTP://''到https://開頭':瀏覽器將仍然使(全)初始在重定向之前通過純HTTP進行請求。見:http://stackoverflow.com/a/8765067/372643 – Bruno 2012-01-14 12:52:11

+0

@布魯諾:這是一個有效的關注,感謝指出。它不會影響我正在構建的小型站點,因爲它只接受帖子,並且只有通過http訪問的唯一頁面纔是原始登錄名。 – 2012-01-14 13:02:51

+0

我會建議你不要使用這種邏輯。通過解決各種限制來抵制讓它爲你工作的衝動是非常困難的。安全的數據和不安全的數據需要彼此絕對隔離。所有使用HTTPS的應用程序都是安全的,無論它看起來是不是。所有使用HTTP的地方都不是 - 按照定義......即使加密的數據在HTTP上也不安全。當以這種方式使用隧道時,您可能會認爲您可以控制的安全洞中打開一個洞,但是 - 它違反了我上面概述的原則。 – jinzai 2016-09-14 15:23:21

回答

1

這是我們使用的。很想聽聽它是否可以改進。

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)] 
public class EnforceHttpsAttribute : RequireHttpsAttribute 
{ 
    private static bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     return httpContext.Request.IsSecureConnection; 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (!AuthorizeCore(filterContext.HttpContext)) 
     { 
      HandleNonHttpsRequest(filterContext); 
     } 
     else 
     { 
      var cache = filterContext.HttpContext.Response.Cache; 
      cache.SetProxyMaxAge(new TimeSpan(0L)); 
      cache.AddValidationCallback(CacheValidateHandler, null); 
     } 
    } 

    // ReSharper disable RedundantAssignment 
    private static void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus) 
    // ReSharper restore RedundantAssignment 
    { 
     validationStatus = OnCacheAuthorization(new HttpContextWrapper(context)); 
    } 

    private static HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext) 
    { 
     return !httpContext.Request.IsSecureConnection 
      ? HttpValidationStatus.IgnoreThisRequest 
      : HttpValidationStatus.Valid; 
    } 
} 

迴應置評1

好問題,我不知道。 HandleNonHttpsRequest來自RequireHttpsAttribute。我只是在fiddler2中進行了檢查,並且只有一個請求通過http發送。但是,回覆通過https回來。

我剛剛意識到我們使用上述方法使RequireHttps與輸出緩存一起工作。使用RequireHttps屬性可能會更好。

+0

'HandleNonHttpsRequest'方法是否爲您的或其他邏輯執行重定向? – 2011-12-22 12:44:58

2

像這樣的東西會有所幫助:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
     filters.Add(new RequireHttpsAttribute()); 
    }