2009-12-16 26 views
8

Estoy trabajando en un proyecto que tiene una página que necesita hacer uso del certificado SSL. Todos los enlaces del sitio a esta página usan https en lugar de http, pero en el caso de que un usuario pueda navegar directamente a la página, quiero que la versión http de la página se redireccione a sí misma pero use https.ASP.NET: mejor práctica para redirigir a https

Puedo hacer un Response.Redirect en el evento page_load. Puedo escribir javascript que actualizará la ubicación.href que causará la devolución de datos. Estoy seguro de que hay más formas de despellejar a este gato.

Mi pregunta es, ¿cuál es la mejor práctica para un sitio ASP.NET en IIS 6 o 7 para redirigir una página http a https? ¿Hay una mejor práctica o todas las alternativas son iguales?

+0

fwiw - camino después de la publicación de esta, y después de haber utilizado algunos otros métodos, encontré la siguiente discusión previa muy útiles: http://stackoverflow.com/questions/47089/best-way-in-asp-net-to-force-https-for-an-entire-site –

Respuesta

12

que haría uso de la reescritura de URL para hacer eso. ¿Por qué? porque es simple de implementar, no requiere modificaciones en la aplicación y es fácil de mantener.

En IIS7 que puede lograr que el uso de URL rewrite module, por ejemplo:

<!-- http:// to https:// rule --> 
<rule name="ForceHttpsBilling" stopProcessing="true"> 
    <match url="(.*)billing/(.*)" ignoreCase="true" /> 
    <conditions> 
    <add input="{HTTPS}" pattern="off" ignoreCase="false" /> 
    </conditions> 
    <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}{REQUEST_URI}" /> 
</rule> 

En IIS6 que tendrá que utilizar una biblioteca tercera parte. Yo uso IIRF (http://www.codeplex.com/IIRF) es gratis, estable y tiene una buena cantidad de funciones.

+0

Gracias por agregar un ejemplo Pavel. Todavía estoy en IIS6, así que no me he ensuciado con el módulo de reescritura de IIS7. Sin embargo, parece prometedor :) – Ariel

1

Llamaría a Response.Redirect en page_load. Es más simple que generar javascript y enviará menos bytes al cliente.

Code example

+0

Ray: ese es un buen punto acerca de que se envían menos bytes cuando se usa el La lógica de CodeFile en lugar de javascript que se envía en cada solicitud.Gracias –

+0

Al redireccionar a través de js también debe pensar en clientes sin js o con js deshabilitados, lo que haría que la aplicación sea menos segura. La validación del lado del servidor es más ligera y más segura. – Ariel

2

En realidad, la mejor práctica sería hacer esto en uno de tres lugares, suponiendo que el hardware o la configuración de IIS no son una opción. Solo código de opciones.

  1. En un HTTPModule. Los HttpModules se ejecutan antes de que se procese cualquier solicitud, por lo que podría hacer la comprobación de URL y redirigir allí. Esto es lo que haría.
  2. En Global.asax.
  3. En una página base personalizada, en la función init.

Todas esas serían buenas opciones. Uno y dos están garantizados para ser afectados por cada solicitud procesada por ASP.NET. El tercero requiere que se asegure de que todas sus páginas hereden de la página base.

No coloque el código en cada página, es solo una mala programación.

Avíseme si necesita más aclaraciones, pero este es un buen comienzo.

+1

+1 respuesta muy válida no tienen idea de por qué alguien DV'd –

1

Generalmente, hay partes específicas del sitio que o bien desea siempre ser HTTPS o HTTP.

utilizo el siguiente atributo de acción para convertir el tráfico, ya sea a uno u otro:

public class ForceConnectionSchemeAttribute : ActionFilterAttribute 
{ 
    private string scheme; 

    public ForceConnectionSchemeAttribute(string scheme) 
    { 
     this.scheme = scheme.ToLower(); 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Uri url = filterContext.HttpContext.Request.Url; 
     if (url.Scheme != scheme) 
     { 
      string secureUrl = String.Format("{0}://{1}{2}", scheme, url.Host, url.PathAndQuery); 
      filterContext.Result = new RedirectResult(secureUrl); 
     } 
    } 
} 


// Suppose I always want users to use HTTPS to access their personal info: 
[ForceConnectionScheme("https")] 
public class UserController: Controller 
{ 
    // blah 
} 
+0

Este enfoque asume que estás usando MVC. –

Cuestiones relacionadas