2010-04-01 17 views
16

Estoy usando ASP.NET MVC 2 y tengo una página de inicio de sesión que está protegida mediante HTTPS. Para garantizar que el usuario siempre acceda a esas páginas a través de SSL, agregué el atributo [RequireHttps] al controlador. Esto hace el trabajo a la perfección.Redirigir lejos de HTTPS con la aplicación ASP.NET MVC

Cuando hayan iniciado sesión con éxito, me gustaría redirigirlos a la versión HTTP. Sin embargo, no hay un atributo [RequireHttp] y estoy luchando para entender cómo podría lograr esto.

La complicación adicional (potencial) es que el sitio web en producción está alojado en la ruta del dominio, pero para fines de desarrollo y prueba se encuentra dentro de un subdirectorio/directorio virtual/aplicación.

¿Estoy pensando demasiado en esto y hay una solución fácil que me mira a la cara? ¿O es un poco más complejo?

+0

posible duplicado de http://stackoverflow.com/questions/761704/mixed-http-https-site – Gonzalo

+4

Esto no es un duplicado (al menos no de los enlaces de una Gonzalo) como yo quiero viajar La otra manera. * desde * HTTPS * a * HTTP. A menos que haya un parámetro que no puedo encontrar en '[RequireHttps]', entonces eso no me sirve. – Amadiere

Respuesta

25

Después de un poco de excavación, seguí las líneas de la mía ya que no parecía haber una buena solución integrada para esto (como se mencionó, hay una excelente para aplicaciones MVC2 en la forma de [RequireHttps]). Inspirado por la solución çağdaş 's de this problem y yo adapated para subir con el siguiente código:

public class RequireHttp : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // If the request has arrived via HTTPS... 
     if (filterContext.HttpContext.Request.IsSecureConnection) 
     { 
      filterContext.Result = new RedirectResult(filterContext.HttpContext.Request.Url.ToString().Replace("https:", "http:")); // Go on, bugger off "s"! 
      filterContext.Result.ExecuteResult(filterContext); 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 

ahora puedo añadir esto a mis métodos de controlador y se comporta (aparentemente) como se esperaba. Si redirecciono a la acción Index en mi controlador desde un protocolo HTTPS, se redireccionará a HTTP. Solo permite el acceso HTTP al Index ActionResult.

[RequireHttp] 
public ActionResult Index() { 
    return View(); 
} 
Cuestiones relacionadas