¿La mejor manera en asp.net para forzar https para un sitio completo?

Hace aproximadamente 6 meses implementé un sitio donde todas las solicitudes debían superar https. La única forma en que podía encontrar para asegurarme de que cada solicitud a una página superaba https era verificarlo en el evento de carga de página. Si la solicitud no fuera HTTP, respondería response.redirect (” https://example.com “)

¿Hay una manera mejor? ¿Idealmente alguna configuración en la web.config?

Por favor utiliza HSTS

de http://www.hanselman.com/blog/HowToEnableHTTPStrictTransportSecurityHSTSInIIS7.aspx

< ?xml version="1.0" encoding="UTF-8"?>                         

Respuesta original (reemplazada por la anterior el 4 de diciembre de 2015)

básicamente

 protected void Application_BeginRequest(Object sender, EventArgs e) { if (HttpContext.Current.Request.IsSecureConnection.Equals(false) && HttpContext.Current.Request.IsLocal.Equals(false)) { Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"] + HttpContext.Current.Request.RawUrl); } } 

eso iría en global.asax.cs (o global.asax.vb)

no sé de una forma de especificarlo en la web.config

La otra cosa que puede hacer es usar HSTS devolviendo el encabezado “Strict-Transport-Security” al navegador. El navegador tiene que admitir esto (y en este momento, son fundamentalmente Chrome y Firefox), pero significa que una vez configurado, el navegador no realizará solicitudes al sitio a través de HTTP y, en cambio, las traducirá a solicitudes HTTPS antes de emitirlas. . Pruebe esto en combinación con una redirección de HTTP:

 protected void Application_BeginRequest(Object sender, EventArgs e) { switch (Request.Url.Scheme) { case "https": Response.AddHeader("Strict-Transport-Security", "max-age=300"); break; case "http": var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery; Response.Status = "301 Moved Permanently"; Response.AddHeader("Location", path); break; } } 

Los navegadores que no conocen HSTS simplemente ignorarán el encabezado, pero seguirán siendo atrapados por la statement de cambio y enviados a HTTPS.

El módulo IIS7 te permitirá redirigir.

             

Para aquellos que usan ASP.NET MVC. Puede usar lo siguiente para forzar SSL / TLS sobre HTTPS en todo el sitio de dos maneras:

El camino difícil

1 – Agregue RequireHttpsAttribute a los filtros globales:

 GlobalFilters.Filters.Add(new RequireHttpsAttribute()); 

2 – Forzar tokens antifalsificación para usar SSL / TLS:

 AntiForgeryConfig.RequireSsl = true; 

3 – Exige que las cookies requieran HTTPS de forma predeterminada al cambiar el archivo Web.config:

    

4 – Utilice el paquete NWebSec.Owin NuGet y agregue la siguiente línea de código para habilitar la Seguridad de transporte estricta en todo el sitio. No olvide agregar la directiva Preload a continuación y enviar su sitio al sitio de HSTS Preload . Más información aquí y aquí . Tenga en cuenta que si no está utilizando OWIN, hay un método Web.config que puede leer en el sitio de NWebSec .

 // app is your OWIN IAppBuilder app in Startup.cs app.UseHsts(options => options.MaxAge(days: 30).Preload()); 

5 – Utilice el paquete NWebSec.Owin NuGet y agregue la siguiente línea de código para habilitar la fijación de clave pública (HPKP) en todo el sitio. Más información aquí y aquí .

 // app is your OWIN IAppBuilder app in Startup.cs app.UseHpkp(options => options .Sha256Pins( "Base64 encoded SHA-256 hash of your first certificate eg cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=", "Base64 encoded SHA-256 hash of your second backup certificate eg M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=") .MaxAge(days: 30)); 

6 – Incluye el esquema https en cualquier URL utilizada. Content Security Policy (CSP) El encabezado HTTP y Subresource Integrity (SRI) no funcionan bien cuando se imita el esquema en algunos navegadores. Es mejor ser explícito sobre HTTPS. p.ej

  

La manera fácil

Use la plantilla de proyecto ASP.NET MVC Boilerplate Visual Studio para generar un proyecto con todo esto y mucho más incorporado. También puede ver el código en GitHub .

Si no puede configurar esto en IIS por el motivo que sea, crearía un módulo HTTP que redirecciona por usted:

 using System; using System.Web; namespace HttpsOnly { ///  /// Redirects the Request to HTTPS if it comes in on an insecure channel. ///  public class HttpsOnlyModule : IHttpModule { public void Init(HttpApplication app) { // Note we cannot trust IsSecureConnection when // in a webfarm, because usually only the load balancer // will come in on a secure port the request will be then // internally redirected to local machine on a specified port. // Move this to a config file, if your behind a farm, // set this to the local port used internally. int specialPort = 443; if (!app.Context.Request.IsSecureConnection || app.Context.Request.Url.Port != specialPort) { app.Context.Response.Redirect("https://" + app.Context.Request.ServerVariables["HTTP_HOST"] + app.Context.Request.RawUrl); } } public void Dispose() { // Needed for IHttpModule } } } 

A continuación, compílelo en una DLL, agréguela como referencia a su proyecto y colóquela en web.config:

     

Lo que debes hacer es:

1) Agregue una clave dentro de web.config, dependiendo del servidor de producción o etapa como se muestra a continuación

  or  

2) Dentro de su archivo Global.asax, agregue el siguiente método.

 void Application_BeginRequest(Object sender, EventArgs e) { //if (ConfigurationManager.AppSettings["HttpsServer"].ToString() == "prod") if (ConfigurationManager.AppSettings["HttpsServer"].ToString() == "stage") { if (!HttpContext.Current.Request.IsSecureConnection) { if (!Request.Url.GetLeftPart(UriPartial.Authority).Contains("www")) { HttpContext.Current.Response.Redirect( Request.Url.GetLeftPart(UriPartial.Authority).Replace("http://", "https://www."), true); } else { HttpContext.Current.Response.Redirect( Request.Url.GetLeftPart(UriPartial.Authority).Replace("http://", "https://"), true); } } } } 

También depende de la marca de su equilibrador, para el mux web, debe buscar el encabezado http X-WebMux-SSL-termination: true para calcular que el tráfico entrante fue ssl. detalles aquí: http://www.cainetworks.com/support/redirect2ssl.html

Para @Joe anterior, “Esto me está dando un bucle de redirección. Antes de agregar el código, funcionó bien. ¿Alguna sugerencia?” Joe Nov 8 ’11 at 4:13 ”

Esto también me estaba sucediendo y lo que creo que estaba sucediendo es que había un equilibrador de carga que terminaba la solicitud de SSL frente al servidor web. Por lo tanto, mi sitio web siempre estuvo pensando que la solicitud era “http”, incluso si el navegador original solicitaba que fuera “https”.

Admito que esto es un poco hacky, pero lo que funcionó para mí fue implementar una propiedad “JustRedirected” que pude aprovechar para descubrir que la persona ya fue redirigida una vez. Por lo tanto, pruebo las condiciones específicas que justifican la redirección y, si se cumplen, establezco esta propiedad (valor almacenado en sesión) antes de la redirección. Incluso si las condiciones http / https para la redirección se cumplen la segunda vez, omito la lógica de redirección y restablezco el valor de la sesión “JustRedirected” a falso. Necesitará su propia lógica de prueba condicional, pero aquí hay una implementación simple de la propiedad:

  public bool JustRedirected { get { if (Session[RosadaConst.JUSTREDIRECTED] == null) return false; return (bool)Session[RosadaConst.JUSTREDIRECTED]; } set { Session[RosadaConst.JUSTREDIRECTED] = value; } } 

Si el soporte SSL no es configurable en su sitio (es decir, debería poder activar / desactivar https), puede usar el atributo [RequireHttps] en cualquier acción de controlador / controlador que desee proteger.

Voy a arrojar mis dos centavos. SI tiene acceso al lado del servidor IIS, puede forzar HTTPS mediante el uso de enlaces de protocolo. Por ejemplo, tienes un sitio web llamado Blah . En IIS configuraría dos sitios: Blah y Blah (Redirect) . Para Blah solo configure el enlace HTTPS (y FTP si es necesario, asegúrese de forzarlo a través de una conexión segura también). Para Blah (Redirect) solo configure el enlace HTTP . Por último, en la sección Redirect HTTP para Blah (Redirect), asegúrese de establecer un redireccionamiento 301 a https://blah.com , con el destino exacto habilitado. Asegúrese de que cada sitio en IIS apunte a su propia carpeta raíz; de lo contrario, Web.config se estropeará. También asegúrese de tener HSTS configurado en su sitio HTTPSed para que las solicitudes posteriores del navegador siempre se fuercen a HTTPS y no se produzcan redirecciones.

Esta es una respuesta más completa basada en @Troy Hunt. Agregue esta función a su clase de aplicación WebApplication en Global.asax.cs :

  protected void Application_BeginRequest(Object sender, EventArgs e) { // Allow https pages in debugging if (Request.IsLocal) { if (Request.Url.Scheme == "http") { int localSslPort = 44362; // Your local IIS port for HTTPS var path = "https://" + Request.Url.Host + ":" + localSslPort + Request.Url.PathAndQuery; Response.Status = "301 Moved Permanently"; Response.AddHeader("Location", path); } } else { switch (Request.Url.Scheme) { case "https": Response.AddHeader("Strict-Transport-Security", "max-age=31536000"); break; case "http": var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery; Response.Status = "301 Moved Permanently"; Response.AddHeader("Location", path); break; } } } 

(Para habilitar SSL en su comstackción local, habilítelo en el Dock de Propiedades para el proyecto)

-> Simplemente agregue [RequireHttps] en la parte superior de la clase pública HomeController: Controller.

-> Y añada GlobalFilters.Filters.Add (new RequireHttpsAttribute ()); en el método ‘protected void Application_Start ()’ en el archivo Global.asax.cs.

Lo cual fuerza a su aplicación completa a HTTPS.

Si está utilizando ASP.NET Core, puede probar el paquete nuget SaidOut.AspNetCore.HttpsWithStrictTransportSecurity.

Entonces solo necesitas agregar

 app.UseHttpsWithHsts(HttpsMode.AllowedRedirectForGet, configureRoutes: routeAction); 

Esto también agregará el encabezado HTTP StrictTransportSecurity a todas las solicitudes realizadas usando el esquema https.

Código de ejemplo y documentación https://github.com/saidout/saidout-aspnetcore-httpswithstricttransportsecurity#example-code