2012-02-20 12 views
7

Una volta posto [RequireHttps] su un'azione e utente passa da HTTP a HTTPS, tutti i link successivi rimarranno HTTPS ...ASP.NET MVC [RequireHttps] - ritorno a http

Esiste un modo per tornare alla HTTP?

+0

Questo può essere fatto con i filtri. Prova a cercare SO, ci sono molte domande quasi identiche alle tue. –

risposta

6

Tecnicamente, si potrebbe fare

Si potrebbe look at the source di RequireHttpsAttribute e invertirlo.

In pratica, probabilmente non dovrebbe

Se la sessione è ancora vivo, it is generally inadvisable to return to HTTP. Questo può essere il foundation for a variety of attacks, ad esempio, session hijacking.

+0

Grazie per tutti i link: generalmente sono d'accordo con te, ma ho una pagina "contattaci" per la quale mi piacerebbe applicare SSL - il resto del sito è informativo. – zam6ak

+0

@ zam6ak Nessun problema. Sarai OK se il resto del sito è solo informativo, ma cosa speri di guadagnare tornando su HTTP? –

+0

Ho letto da qualche parte che gli schemi di commutazione "fanno male" SEO. Sfortunatamente, non ho più link all'articolo e non sono sicuro al 100% se è vero ... – zam6ak

1

Ecco l'attributo 'ExitHttpsIfNotRequired' uso:

[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); 
    } 
} 
Problemi correlati