2012-01-24 11 views
6

Encontré This Post y parece que necesitaba una aplicación, mi pregunta es ¿cómo puede volver a http simple cuando https ya no es necesario? ¿Hará esto intrínsecamente basándose en una acción que no tenga la anotación [RequireHttps]?MVC3 después de [RequireHttps] cómo asegurar que no se usa https

EDIT: encontré un par de publicaciones que hablaban de pasar de https a http (here & here). Sin embargo, aún agradecería una respuesta a la pregunta a continuación.

Como alternativa, he debatido sobre abrir la aplicación en una nueva ventana. ¿Es una suposición razonable que el https solo se aplicará a la nueva ventana?

+0

vez que el usuario ha navegado a través requirehttps, si regresan a un controlador sin requirehttps que todavía estará bajo el https. –

+0

¿por qué volver al http simple? Existe un gran riesgo de seguridad allí, primero se transmiten los tokens de autenticación de formularios y los identificadores de sesión pueden ser olfateados fácilmente. Use RequireSsl en sus formularios auth (si lo está usando) pero a su vez la nota en cualquier lugar que no sea ssl fallará. Ejecute todo su sitio ssl + comprenda cuán fácil es robar una sesión de un único paquete http registrado. –

+0

@AdamTuliper Actualmente no tengo/necesito ninguna autenticación. Estoy usando esto para una solicitud de empleo. Una vez que se envía esto, no tiene sentido encriptar su navegación por más tiempo. No guardo nada en la sesión. Nuestro servidor web está creciendo en edad, por lo que cualquier cosa que pueda hacer para aliviar la carga es necesaria, por lo tanto, si ya no NECESITO ssl, ¿para qué molestarse? Dudo que el cifrado vaya a atascar la máquina, pero supongo que no lo usaría donde no fuera necesario, ya que el cifrado de recursos no es gratuito. – Jared

Respuesta

7

ASP.NET MVC's RequireHttps solo va en una dirección. En el pasado me acaba de crear mi propia aplicación FilterAttribute para permitir viajes en ambos sentidos:

EnsureHttpsAttribute

public class EnsureHttpsAttribute : FilterAttribute, IAuthorizationFilter 
    { 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     Verify.NotNull(filterContext, "filterContext"); 
     Verify.True(filterContext.HttpContext.Request.HttpMethod.Equals("GET", StringComparison.OrdinalIgnoreCase), "filterContext"); 

     var request = filterContext.HttpContext.Request; 
     if (request.Url != null && !request.IsSecureConnection && !request.IsLocal) 
     filterContext.Result = new RedirectResult("https://" + request.Url.Host + request.RawUrl); 
    } 
    } 

EnsureHttpAttribute

public class EnsureHttpAttribute : FilterAttribute, IAuthorizationFilter 
    { 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     Verify.NotNull(filterContext, "filterContext"); 
     Verify.True(filterContext.HttpContext.Request.HttpMethod.Equals("GET", StringComparison.OrdinalIgnoreCase), "filterContext"); 

     var request = filterContext.HttpContext.Request; 
     if (request.Url != null && request.IsSecureConnection) 
     filterContext.Result = new RedirectResult("http://" + request.Url.Host + request.RawUrl); 
    } 
    } 

Casi la misma implementación que RequireHttpsAttribute si la memoria no sirve ; aunque la implementación anterior comprueba si se trata de una solicitud Local e ignora el cambio a HTTPS.

+0

¿Alguna idea sobre la segunda parte de mi pregunta? Si abro la acción en una nueva ventana, ¿estoy en lo correcto al asumir que https solo se aplicará a la nueva ventana? – Jared

+0

Suponiendo URL relativas en la ventana emergente, todo en la nueva ventana seguirá siendo HTTPS a menos que tenga una URL absoluta para volver a HTTP de forma explícita. La ventana principal permanecerá en http a menos que navegue o redireccione explícitamente a HTTPS. –

+0

Probablemente no sea una buena idea redirigir las solicitudes POST ya que esto podría confundir al navegador. cf la implementación oficial del atributo. – nakhli

2
+0

Artículo interesante y buena información. Sin embargo, no estoy haciendo ninguna autenticación en mi sitio en este momento.Una vez que esto suceda, podría ver que esto es muy útil, así que gracias por el enlace. – Jared

+0

Creo que a partir de las otras respuestas y publicaciones en SO, la mayoría de las personas terminan escribiendo su propio atributo personalizado para manejar situaciones únicas. –

+0

Hasta ahora eso es lo que parecía. Creo que lo más probable es que haga que se redirija automáticamente a una URL absoluta que no sea https una vez que haga que terminen el formulario o abran una nueva ventana en https y dejen solo la ventana de su navegador anterior. – Jared

Cuestiones relacionadas