我有一個網站需要使用SSL進行保護。我如何設置一個路由或IIS配置,自動發送非SSL協議接收到的任何請求到SSL協議?這是否可以作爲路由規則來處理,或者最好是僅在主控制器上使用RequireHttps
屬性,而不是在控制器本身上使用,並且在Index()
方法中檢測協議?MVC3:如何將非SSL請求自動路由到SSL協議?
作爲說明:我讀this question,它使用UrlRewriting和IIS7的應用程序請求路由,但我堅持與IIS6和UrlRewriting不是我的選項。
我有一個網站需要使用SSL進行保護。我如何設置一個路由或IIS配置,自動發送非SSL協議接收到的任何請求到SSL協議?這是否可以作爲路由規則來處理,或者最好是僅在主控制器上使用RequireHttps
屬性,而不是在控制器本身上使用,並且在Index()
方法中檢測協議?MVC3:如何將非SSL請求自動路由到SSL協議?
作爲說明:我讀this question,它使用UrlRewriting和IIS7的應用程序請求路由,但我堅持與IIS6和UrlRewriting不是我的選項。
這是我們使用的。很想聽聽它是否可以改進。
[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屬性可能會更好。
'HandleNonHttpsRequest'方法是否爲您的或其他邏輯執行重定向? – 2011-12-22 12:44:58
像這樣的東西會有所幫助:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new RequireHttpsAttribute());
}
不要依賴於自動重定向太多來自'HTTP://''到https://開頭':瀏覽器將仍然使(全)初始在重定向之前通過純HTTP進行請求。見:http://stackoverflow.com/a/8765067/372643 – Bruno 2012-01-14 12:52:11
@布魯諾:這是一個有效的關注,感謝指出。它不會影響我正在構建的小型站點,因爲它只接受帖子,並且只有通過http訪問的唯一頁面纔是原始登錄名。 – 2012-01-14 13:02:51
我會建議你不要使用這種邏輯。通過解決各種限制來抵制讓它爲你工作的衝動是非常困難的。安全的數據和不安全的數據需要彼此絕對隔離。所有使用HTTPS的應用程序都是安全的,無論它看起來是不是。所有使用HTTP的地方都不是 - 按照定義......即使加密的數據在HTTP上也不安全。當以這種方式使用隧道時,您可能會認爲您可以控制的安全洞中打開一個洞,但是 - 它違反了我上面概述的原則。 – jinzai 2016-09-14 15:23:21