redirigir only net iis7 how force asp c# asp.net vb.net webforms https

c# - only - ¿La mejor manera en asp.net para forzar https para un sitio completo?



redirigir http a https iis7 (14)

-> 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.

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?


El módulo IIS7 te permitirá redirigir.

<rewrite> <rules> <rule name="Redirect HTTP to HTTPS" stopProcessing="true"> <match url="(.*)"/> <conditions> <add input="{HTTPS}" pattern="^OFF$"/> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther"/> </rule> </rules> </rewrite>


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 compilación local, habilítelo en el Dock de Propiedades para el proyecto)


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 declaración de cambio y enviados a HTTPS.


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

<add key="HttpsServer" value="stage"/> or <add key="HttpsServer" value="prod"/>

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); } } } }


Otra ventaja de hacer el módulo http es que, si solo lo proporciona en global.asax.cs, solo verifica SSL en Application_BeginRequest, lo que significa que su aplicación no está completamente protegida; solo se enrutará a la versión SSL al primer intento, luego el usuario podría cortar y pegar la url none de SSL y omitirla.


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; } }


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:

<system.web> <httpCookies httpOnlyCookies="true" requireSSL="true" /> </system.web>

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 here y here . 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 here y here .

// app is your OWIN IAppBuilder app in Startup.cs app.UseHpkp(options => options .Sha256Pins( "Base64 encoded SHA-256 hash of your first certificate e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=", "Base64 encoded SHA-256 hash of your second backup certificate e.g. 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

<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js"></script>

La manera fácil

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


Por favor utiliza HSTS

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

<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="HTTP to HTTPS redirect" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" /> </rule> </rules> <outboundRules> <rule name="Add Strict-Transport-Security when HTTPS" enabled="true"> <match serverVariable="RESPONSE_Strict_Transport_Security" pattern=".*" /> <conditions> <add input="{HTTPS}" pattern="on" ignoreCase="true" /> </conditions> <action type="Rewrite" value="max-age=31536000" /> </rule> </outboundRules> </rewrite> </system.webServer> </configuration>

Respuesta original

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


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.


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


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 { /// <summary> /// Redirects the Request to HTTPS if it comes in on an insecure channel. /// </summary> 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:

<httpModules> <add name="HttpsOnlyModule" type="HttpsOnly.HttpsOnlyModule, HttpsOnly" /> </httpModules>



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.