2012-02-20 9 views
7

Una vez que coloque [RequireHttps] en una acción y el usuario cambia de HTTP a HTTPS, todos los enlaces posteriores permanecerán HTTPS ...ASP.NET MVC [RequireHttps] - retorno a http

¿Hay una manera de volver a HTTP?

+0

Esto se puede hacer con filtros. Intenta buscar SO, hay muchas preguntas casi exactamente iguales a las tuyas. –

Respuesta

6

Técnicamente, usted podría hacerlo

Usted podría look at the source de RequireHttpsAttribute y revésalo.

En la práctica, es probable que no debe

Si la sesión está todavía vivo, it is generally inadvisable to return to HTTP. Puede ser foundation for a variety of attacks, por ejemplo, session hijacking.

+0

Gracias por todos los enlaces: generalmente estoy de acuerdo con usted, pero tengo una página de "contacto" para la cual me gustaría aplicar SSL: el resto del sitio es informativo. – zam6ak

+0

@ zam6ak No hay problema. Estarás bien si el resto del sitio es solo informativo, pero ¿qué esperas obtener al regresar a HTTP? –

+0

Leí en algún lado que los esquemas de conmutación "duelen" SEO. Desafortunadamente, ya no tengo el enlace del artículo, y no estoy 100% seguro de que eso sea cierto ... – zam6ak

1

Aquí es el atributo 'ExitHttpsIfNotRequired' utilizo:

[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); 
    } 
} 
Cuestiones relacionadas