2010-03-10 15 views
8

Estoy utilizando MVC 1.0 y he creado un "RequireSSLAttribute" (como el de ASP.NET MVC 1.0 Futures pero ignora las directivas SSL para la computadora local). Quiero SSL habilitar las páginas de registro e inicio de sesión para proteger las contraseñas que se envían. Sin embargo, quiero que el resto del sitio no sea SSL.Alternar entre HTTP y HTTPS en ASP.NET MVC 1.0

Al agregar el atributo [RequireSSL] a los métodos de inicio de sesión e inicio de sesión de mi controlador, puedo hacer que la aplicación redirija exitosamente a la página adecuada con HTTPS. Sin embargo, todas las páginas después de registrarse o iniciar sesión continúan usando SSL.

¿Hay alguna manera de hacer que la aplicación vuelva a HTTP sin tener que crear un "RequireNonSslAttribute" que tendría que agregar a todos los demás métodos del controlador?

Gracias.

+0

he tenido el mismo problema, y ​​lo resolvió mediante la creación del mismo que tú. Me encantaría saber si alguien podría ayudar aquí también. –

+0

Es posible que también desee consultar esto: https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet#Rule_-_Use_TLS_for_All_Login_Pages_and_All_Authenticated_Pages – Bruno

Respuesta

1

¿Qué sucede si solo lo agrega a la acción del controlador que redirige después de iniciar sesión? O agrega una redirección en tu controlador base. Por ejemplo, hacemos algo como esto en la base de OnActionExecuting:

 if (req.IsSecureConnection && 
      filterContext.RouteData.Values["controller"] 
         .ToString().ToLower() != "home") 
     { 
      string url = req.Url.ToString().ToLower().Replace("http:", "https:"); 
      res.Redirect(url); 
     } 

Esta era la forma más rápida para que nosotros realizamos básicamente la misma cosa (nuestro controlador local tuvo las acciones de tipo de inicio de sesión).

+0

Esto debería funcionar. El único problema que tengo ahora es que el atributo de acción en la etiqueta de formulario representada por BeginForm crea una URL relativa que no es HTTPS. Parece que tendré que anular el atributo de acción con una URL absoluta HTTPS utilizando la versión sobrecargada del método BeginForm. Debería funcionar, pero ugh. – goombaloon

1

En su clase ControllerBase, puede anular Controller.OnAuthorization y luego verificar si el atributo RequireHttps (RequireHttpsAttribute es nuevo en MVC2) se establece en la Acción del controlador. Si el atributo RequireHttps no está establecido Y la solicitud está en SSL, devuelve un resultado de redireccionamiento a la url que no es SSL. De esta forma, no es necesario establecer un atributo de controlador y luego poner un nombre de controlador.acción en otro lugar.

protected override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    Boolean requireHttps = false; 
    requireHttps = filterContext.ActionDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), false).Count() >= 1; 

    //the RequireHttpsAttribute set on the Controller Action 
    //will handle redirecting to Https. 
    // We just need to handle any requests 
    //that are already under SSL but should not be. 

    //If this request is under ssl but yet the controller action 
    // does not require it, then redirect to the http version. 
    if (Request.IsSecureConnection && !requireHttps) 
    { 
     UriBuilder uriBuilder = new UriBuilder(Request.Url); 

     //change the scheme 
     uriBuilder.Scheme = "http"; 
     uriBuilder.Port = 80; 

     filterContext.Result = this.Redirect(uriBuilder.Uri.AbsoluteUri); 
    } 


    base.OnAuthorization(filterContext); 
} 
1

Pasar de HTTPS a HTTP, mientras que el usuario ha iniciado sesión en conlleva un riesgo de seguridad porque en los postes posteriores la cookie de autenticación todavía se transmitirá desde el navegador para el usuario, pero esta vez no será encriptada.

Una vez que se haya iniciado sesión, es mejor (desde la perspectiva de seguridad) continuar usando HTTPS. En cualquier caso, siempre y cuando la sesión TCP esté activada, se establece la vibración inicial de la mano, por lo que tampoco habrá un gran impacto en el rendimiento.

0

Utilicé este código en Controller.OnAturhotization.

var redirect = string.Format(
"https://{0}{1}", 
filterContext.HttpContext.Request.Url.Authority, 
Response.ApplyAppPathModifier(filterContext.HttpContext.Request.Url.AbsolutePath)); 
var queryString = filterContext.HttpContext.Request.QueryString.ToString(); 
if (!string.IsNullOrEmpty(queryString)) 
redirect += "?" + queryString; 

filterContext.Result = new RedirectResult(redirect); 

Response.ApplyAppPathModifier es el soporte para sesiones sin cookies.

HttpResponse.ApplyAppPathModifier Method (System.Web)

Cuestiones relacionadas