2009-03-26 11 views

Respuesta

9

Esto generalmente se gestionan a través de la configuración de IIS o con un filtro ISAPI, pero si quiere hacerlo en el código de la aplicación, se podría poner algo como esto en el caso Page_Init de su página principal ...

If Not Request.IsSecure 
    Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://")) 
End If 
+2

No es la mejor de las ideas. Está haciendo un redireccionamiento del lado del cliente a la página de llamadas. Si no hay SSL por el motivo que sea (sin certificado o certificado incorrecto), ingresará en un ciclo recursivo. Una mejor opción sería redirigir a una página de error ya que el usuario no debe ingresar a un sitio/página de seguridad, a menos que el código lo haga incorrectamente o que esté jugando con la URL. –

+1

Esto funciona bien con la advertencia de que el método string.replace cambiará todas las apariciones de "http: //" a "https: //", no solo el esquema inicial. Es decir. puede interferir con los parámetros de cadena de consulta. –

+0

@Daniel si tiene los caracteres: o/en sus cadenas de consulta, entonces tendrá otros problemas de los que preocuparse;) –

2

Me gustaría redirigir todas las URL http a https con una página separada, o usar la opción "requerir canal seguro" en su configuración de IIS, que mostrará un error si alguien intenta acceder a una página que no sea https.

Here's un sitio con una guía para redirigir la página de error a la URL https de su sitio.

+0

Hacer esto en el nivel del servidor web es, de lejos, la mejor opción. Proporciona mayor flexibilidad en el futuro si se introduce hardware de equilibrio de carga SSL especialmente. –

0
if(!String.Equals(Request.Url.Scheme, 
        "https", 
        StringComparison.OrdinalIgnoreCase)) { } 
+0

Esta es una propiedad de solo lectura; consulte http://msdn.microsoft.com/en-us/library/system.uri.scheme.aspx – Rich

+0

Sí, lo es. Está bien para la comparación de cuerdas, ¿no? – abatishchev

+0

Sí, y parece que su respuesta ha sido editada para reflejar eso. Solo había comentado porque en la primera publicación parecía que se podía cambiar programáticamente el Esquema de http "a" https ". – Rich

0

Si desea aceptar sólo conexiones seguras, crear un servicio independiente para el puerto 80 que sólo se redirige a HTTPS. Idealmente, conservaría la ruta solicitada en la redirección HTTP.

Si simplemente desea animar a las conexiones HTTPS para la navegación (y no se preocupan por los robots, por ejemplo), añadir esto a sus páginas:

<script type="text/javascript"> 
if(location.protocol=='http:') 
    location=location.toString().replace(/^http:/,'https:'); 
</script> 
1

He hecho esto con un HTTPModule para que no tiene que preocuparse por poner el código en cada página maestra (si tiene más de una). Esta versión también desactiva la redirección de localhost para que no tengas que tener SSL en tu propia máquina. Básicamente que hacer un nuevo módulo HTTP como esto:

Public Class RedirectToHttpsModule 
    Implements IHttpModule 

    Public Sub Dispose() Implements IHttpModule.Dispose 

    End Sub 

    Public Sub Init(ByVal context As HttpApplication) Implements IHttpModule.Init 
     AddHandler context.BeginRequest, AddressOf context_BeginRequest 
    End Sub 

    Private Sub context_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) 
     Dim application As HttpApplication = TryCast(sender, HttpApplication) 
     If Not application.Request.IsSecureConnection And Not application.Request.IsLocal Then 
      application.Response.Redirect(application.Request.Url.ToString().Replace(application.Request.Url.Scheme, "https")) 
     End If 
    End Sub 

End Class 

También hay que añadir la línea correspondiente en web.config para el HTTPModule:

<httpModules> 
     <add type="RedirectToHttpsModule" name="RedirectToHttpsModule" /> 
</httpModules> 
2

Lo siguiente se basa en respuesta Josh Stodolas (IsSecureConnection) pero usa UriBuilder para cambiar el esquema a https en lugar de reemplazar una cadena. El beneficio de este enfoque es que no cambiará todas las instancias de "http" en la URL a "https".

if (!Request.IsSecureConnection) 
{ 
    UriBuilder newUri = new UriBuilder(Request.Url); 
    newUri.Scheme = Uri.UriSchemeHttps; 
    Response.Redirect(newUri.Uri.AbsoluteUri); 
} 
Cuestiones relacionadas