c# - redireccionar - require ssl iis
Cómo forzar HTTPS utilizando un archivo web.config (8)
He buscado en Google y StackOverflow tratando de encontrar una solución a esto, pero todos parecen estar relacionados con ASP.NET, etc.
Normalmente ejecuto Linux en mis servidores pero para este cliente estoy usando Windows con IIS 7.5 (y Plesk 10). Esta es la razón por la que no estoy familiarizado con los archivos IIS y web.config . En un archivo .htaccess
puede usar las condiciones de reescritura para detectar si el protocolo es HTTPS y redirigir en consecuencia. ¿Hay una manera simple de lograr esto usando un archivo web.config, o incluso usando el módulo '' URL Rewrite '' que he instalado?
No tengo experiencia con ASP.NET así que si esto está involucrado en la solución, por favor incluya pasos claros sobre cómo implementarlo.
La razón por la que hago esto con web.config y no PHP es que me gustaría forzar HTTPS en todos los activos dentro del sitio.
La excelente biblioteca de NWebsec puede actualizar sus solicitudes de HTTP a HTTPS utilizando su etiqueta upgrade-insecure-requests
dentro de Web.config
:
<nwebsec>
<httpHeaderSecurityModule>
<securityHttpHeaders>
<content-Security-Policy enabled="true">
<upgrade-insecure-requests enabled="true" />
</content-Security-Policy>
</securityHttpHeaders>
</httpHeaderSecurityModule>
</nwebsec>
La respuesta aceptada no funcionó para mí. Seguí los pasos en este blog .
Un punto clave que me faltaba era que necesitaba descargar e instalar la herramienta de reescritura de URL para IIS. Lo encontré here . El resultado fue el siguiente.
<rewrite>
<rules>
<remove name="Http to Https" />
<rule name="Http to Https" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<serverVariables />
<action type="Redirect" url="https://{HTTPS_HOST}{REQUEST_URI}" />
</rule>
</rules>
</rewrite>
Necesita el módulo de reescritura de URL, preferiblemente v2 (no tengo v1 instalado, por lo que no puedo garantizar que funcionará allí, pero debería).
Aquí hay un ejemplo de tal web.config: forzará HTTPS para TODOS los recursos (usando 301 Redirect Permanente):
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<clear />
<rule name="Redirect to https" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
PD: esta solución en particular no tiene nada que ver con ASP.NET/PHP ni con ninguna otra tecnología, ya que solo se utiliza el módulo de reescritura de URL (se procesa en uno de los niveles inicial / inferior) antes de que la solicitud llegue al punto donde su código se ejecuta.
No pude instalar URL Rewrite en mi entorno.
Entonces, encontré otro camino.
Al agregar esto a mi web.config agregué la reescritura de error y trabajé en IIS 7.5
<system.webServer>
<httpErrors errorMode="Custom" defaultResponseMode="File" defaultPath="C:/WebSites/yoursite/" >
<remove statusCode="403" subStatusCode="4" />
<error statusCode="403" subStatusCode="4" responseMode="File" path="redirectToHttps.html" />
</httpErrors>
Luego, siguiendo los consejos aquí: https://www.sslshopper.com/iis7-redirect-http-to-https.html
Creé el archivo html que hace la redirección (redirectToHttps.html):
<html>
<head><title>Redirecting...</title></head>
<script language="JavaScript">
function redirectHttpToHttps()
{
var httpURL= window.location.hostname + window.location.pathname + window.location.search;
var httpsURL= "https://" + httpURL;
window.location = httpsURL;
}
redirectHttpToHttps();
</script>
<body>
</body>
</html>
Espero que alguien lo encuentre útil ya que no pude encontrar todas las piezas en un lugar en otro lado.
Para aquellos que usan ASP.NET MVC. Puede usar RequireHttpsAttribute para forzar todas las respuestas a ser HTTPS:
GlobalFilters.Filters.Add(new RequireHttpsAttribute());
Otras cosas que también puede querer hacer para ayudar a proteger su sitio:
Forzar tokens antifalsificación para usar SSL / TLS:
AntiForgeryConfig.RequireSsl = true;
Requerir que las cookies requieran HTTPS por defecto al cambiar el archivo Web.config:
<system.web> <httpCookies httpOnlyCookies="true" requireSSL="true" /> </system.web>
Utilice el paquete NWebSec.Owin NuGet y agregue la siguiente línea de código para habilitar Seguridad de transporte estricta (HSTS) 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: 720).Preload());
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));
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>
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 .
Para aumentar la respuesta de LazyOne, aquí hay una versión anotada de la respuesta.
<rewrite>
<rules>
<clear />
<rule name="Redirect all requests to https" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action
type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}"
redirectType="Permanent" appendQueryString="false" />
</rule>
</rules>
</rewrite>
Borre todas las demás reglas que ya se hayan definido en este servidor. Cree una nueva regla, que llamaremos "Redirigir todas las solicitudes a https". Después de procesar esta regla, ¡no procese más reglas! Haga coincidir todas las URL entrantes. Luego verifique si todas estas otras condiciones son verdaderas: HTTPS está APAGADO. Bueno, esa es solo una condición (pero asegúrese de que sea verdad). Si es así, envíe una redirección permanente 301 al cliente en http://www.foobar.com/whatever?else=the#url-contains
. ¡No agregue la cadena de consulta al final de eso, porque duplicaría la cadena de consulta!
Esto es lo que significan las propiedades, los atributos y algunos de los valores.
- clear elimina todas las reglas del servidor que de otro modo podríamos heredar.
- regla define una regla.
- nombre un nombre arbitrario (aunque único) para la regla.
- stopProcesa si reenviar la solicitud de inmediato a la interconexión de solicitudes de IIS o primero para procesar reglas adicionales.
- coinciden cuándo ejecutar esta regla.
- url un patrón contra el cual evaluar la URL
- condiciones condiciones adicionales sobre cuándo ejecutar esta regla; las condiciones se procesan solo si hay una primera coincidencia.
- logicalGrouping si todas las condiciones deben ser verdaderas (
MatchAll
) o cualquiera de las condiciones debe ser verdadera (MatchAny
); similar a AND versus OR.
- logicalGrouping si todas las condiciones deben ser verdaderas (
- agregar agrega una condición que debe cumplirse.
- ingrese la entrada que está evaluando una condición; la entrada puede ser variables del servidor.
- patrón el estándar contra el cual evaluar la entrada.
- ignore si la capitalización importa o no.
- acción qué hacer si la
match
y susconditions
son todas verdaderas.- tipo generalmente puede ser
redirect
(lado del cliente) orewrite
(lado del servidor). - url qué producir como resultado de esta regla; en este caso, concatene
https://
con dos variables de servidor. - redirectType lo que HTTP redirige para usar; este es un 301 permanente.
- appendQueryString si agregar o no la cadena de consulta al final de la
url
resultante; en este caso, lo configuramos en falso, porque{REQUEST_URI}
ya lo incluye.
- tipo generalmente puede ser
Las variables del servidor son
-
{HTTPS}
que estáOFF
oON
. -
{HTTP_HOST}
eswww.mysite.com
, y -
{REQUEST_URI}
incluye el resto del URI, por ejemplo,/home?key=value
- el navegador maneja el
#fragment
(vea el comentario de LazyOne).
- el navegador maneja el
Ver también: https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference
Una forma simple es decirle a IIS que envíe su archivo de error personalizado para las solicitudes HTTP. El archivo puede contener una redirección de meta, un redireccionamiento de JavaScript e instrucciones con enlace, etc. Importantemente, puede marcar "Requerir SSL" para el sitio (o carpeta) y esto funcionará.
</configuration>
</system.webServer>
<httpErrors>
<clear/>
<!--redirect if connected without SSL-->
<error statusCode="403" subStatusCode="4" path="errors/403.4_requiressl.html" responseMode="File"/>
</httpErrors>
</system.webServer>
</configuration>
In Dot Net Core, follow the instructions at https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl
***In your startup.cs add the following,***
// Requires using Microsoft.AspNetCore.Mvc;
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new RequireHttpsAttribute());
});`enter code here`
***To redirect Http to Https, add the following in the startup.cs***
// Requires using Microsoft.AspNetCore.Rewrite;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
var options = new RewriteOptions()
.AddRedirectToHttps();
app.UseRewriter(options);