2012-02-20 81 views
7

一旦你放在一個動作和用戶開關[RequireHttps]從HTTP到HTTPS,所有後續鏈接將留HTTPS ...ASP.NET MVC [RequireHttps] - 返回HTTP

有沒有辦法切換回HTTP?

+0

這可以通過過濾器來完成。試着搜索一下,有很多問題幾乎和你的一樣。 – 2012-02-21 02:04:43

回答

6

技術上相當詳細的描述,你可以做到這一點

你可以look at the sourceRequireHttpsAttribute並將其逆轉。

在實踐中,你可能不應該

如果會話還活着,it is generally inadvisable to return to HTTP。這可以是foundation for a variety of attacks,例如session hijacking

+0

感謝您的所有鏈接 - 我通常會同意您的意見,但我有一個「聯繫我們」的網頁,我想強制執行SSL - 網站的其餘部分是信息性的。 – zam6ak 2012-02-20 23:09:35

+0

@ zam6ak沒問題。如果網站的其他部分只是信息性的,那麼你會好的,但是你希望通過返回HTTP獲得什麼? – 2012-02-21 15:58:05

+0

我在某處讀到切換方案「傷害」搜索引擎優化。不幸的是,我沒有鏈接這篇文章了,我不是100%確定這是否屬實。 – zam6ak 2012-02-24 16:19:58

1

這裏的 'ExitHttpsIfNotRequired' 屬性使用:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class RetainHttpsAttribute : Attribute 
{ 
} 

public class ExitHttpsIfNotRequiredAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     // Abort if it's not a secure connection 
     if (!filterContext.HttpContext.Request.IsSecureConnection) return; 

     if (filterContext.ActionDescriptor.ControllerDescriptor.ControllerName == "sdsd") return; 

     // Abort if it's a child controller 
     if (filterContext.IsChildAction) return; 

     // Abort if a [RequireHttps] attribute is applied to controller or action 
     if (filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Length > 0) return; 
     if (filterContext.ActionDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Length > 0) return; 

     // Abort if a [RetainHttps] attribute is applied to controller or action 
     if (filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(RetainHttpsAttribute), true).Length > 0) return; 
     if (filterContext.ActionDescriptor.GetCustomAttributes(typeof(RetainHttpsAttribute), true).Length > 0) return; 

     // Abort if it's not a GET request - we don't want to be redirecting on a form post 
     if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) return; 

     // Abort if the error controller is being called - we may wish to display the error within a https page 
     if (filterContext.ActionDescriptor.ControllerDescriptor.ControllerName == "Error") return; 

     // No problems - redirect to HTTP 
     string url = "http://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl; 
     filterContext.Result = new RedirectResult(url); 
    } 
}