¿Cómo puedo configurar el indicador de seguridad en una cookie de sesión ASP.NET?

146

¿Cómo puedo configurar el indicador de seguridad en una cookie de sesión ASP.NET, para que solo se transmita a través de HTTPS y nunca a través de HTTP simple?

Alex
fuente

Respuestas:

127

Hay dos formas, un httpCookieselemento en le web.configpermite activar requireSSLque solo transmite todas las cookies, incluida la sesión solo en SSL y también dentro de la autenticación de formularios, pero si activa SSL en httpcookies, también debe activarlo dentro de la configuración de formularios.

Editar para mayor claridad: poner esto en<system.web>

<httpCookies requireSSL="true" />
Akash Kava
fuente
13
+1 Para aclarar, esto es lo que debe agregar a la web.config para establecer el indicador de seguridad en la cookie de autenticación en verdadero<httpCookies requireSSL="true" />
Tr1stan
8
Tenga en cuenta que esto depende de su configuración (nivel de servidor). Apagué la región de prueba con el error "La aplicación está configurada para emitir cookies seguras. Estas cookies requieren que el navegador emita la solicitud a través de SSL (protocolo https). Sin embargo, la solicitud actual no es a través de SSL". Esto se debió a que tenemos un proxy inverso en su lugar y los navegadores se conectan a él a través de SSL, pero el proxy inverso al servidor IIS está sobre el puerto 80, por lo que la aplicación no creía que fuera seguro.
mlhDev
44
@Bargitta Manejamos el evento Application_PreSendRequestHeaders y si cierta configuración de la aplicación es verdadera, configuramos todas las cookies para asegurarlas. Esta configuración de la aplicación solo se establece para nuestros sitios externos HTTPS.
mlhDev
Ya veo, así que todo su sitio externo usará HTTPS, gracias.
Bargitta
Había visto en otra parte que después de IIS7 system.web había sido reemplazado por system.webserver, así que intenté poner esta configuración allí. Sin embargo, en IIS 8.5 esto causó un error de configuración, pero todo funcionó si agregué una sección system.web al archivo de configuración y puse la configuración allí.
Eborbob
181

En el <system.web>elemento, agregue el siguiente elemento:

<httpCookies requireSSL="true" />

Sin embargo, si tiene un <forms>elemento en su system.web\authenticationbloque, esto anulará la configuración y la restablecerá al valor httpCookiespredeterminado false.

En ese caso, también debe agregar el requireSSL="true"atributo al elemento de formularios.

Entonces terminarás con:

<system.web>
    <authentication mode="Forms">
        <forms requireSSL="true">
            <!-- forms content -->
        </forms>
    </authentication>
</system.web>

Consulte aquí y aquí la documentación de MSDN de estos elementos.

Martin Eden
fuente
2
Puede evitar otras configuraciones web.config que anulen su configuración <httpCookies requireSSL = "true" /> al incluir el atributo 'lockItem'. Así: <httpCookies requireSSL = "true" lockItem = "true" />. Más información aquí dotnetnoob.com/2010/11/how-to-secure-aspnet-cookies.html
JTech
1
Además, si hay un roleManagerelemento, su atributo cookieRequireSSL="true"también debe establecerse en verdadero. Árbitro. msdn.microsoft.com/en-us/library/…
Jeff Mergler
Al agregar los cambios anteriores en los archivos relacionados, los objetos de sesión no funcionan en mi aplicación, se vuelven nulos. ¿Cómo puedo rectificar este problema entonces?
Sábado
¿Estás utilizando HTTP o HTTPS para tu aplicación? El indicador "seguro" que estamos configurando aquí evita que las cookies se envíen a través de conexiones no cifradas (es decir, HTTP)
Martin Eden
21

Las cosas se complican rápidamente si habla de código registrado en un entorno empresarial. Hemos encontrado que el mejor enfoque es tener la web. Release.config contiene lo siguiente:

<system.web>
  <compilation xdt:Transform="RemoveAttributes(debug)" />
  <authentication>
      <forms xdt:Transform="Replace" timeout="20" requireSSL="true" />
  </authentication>
</system.web>

De esa manera, los desarrolladores no se ven afectados (se ejecutan en Debug), y solo los servidores que obtienen versiones de lanzamiento requieren que las cookies sean SSL.

Mark D
fuente
^^^ Este ^^^ es el camino. Más información sobre: ​​Web.Config transforma: go.microsoft.com/fwlink/?LinkId=125889
Jeff Mergler
0

seguro: este atributo le dice al navegador que solo envíe la cookie si la solicitud se envía a través de un canal seguro como HTTPS. Esto ayudará a proteger la cookie de pasar sobre solicitudes no encriptadas. Si se puede acceder a la aplicación a través de HTTP y HTTPS, existe la posibilidad de que la cookie se pueda enviar en texto sin cifrar.

Sanjeev Kumar
fuente
0

Sobre la base de la respuesta de @Mark D, usaría las transformaciones web.config para configurar todas las cookies a Secure. Esto incluye la configuración anonymousIdentification cookieRequireSSLy httpCookies requireSSL.

Con ese fin, configuraría su web.Release.config como:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web>
    <httpCookies xdt:Transform="SetAttributes(httpOnlyCookies)" httpOnlyCookies="true" />
    <httpCookies xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    <anonymousIdentification xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" /> 
  </system.web>
</configuration>

Si está utilizando la autenticación de roles y formularios con ASP.NET Membership Provider(lo sé, es antiguo) también querrá establecer roleManager cookieRequireSSLlos forms requireSSLatributos y los como seguros también. Si es así, su web.release.config podría verse así (incluido anteriormente más nuevas etiquetas para la API de membresía):

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web>
    <httpCookies xdt:Transform="SetAttributes(httpOnlyCookies)" httpOnlyCookies="true" />
    <httpCookies xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    <anonymousIdentification xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" /> 
    <roleManager xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" />
    <authentication>
        <forms xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    </authentication>
  </system.web>
</configuration>

Los antecedentes de web.config se transforman aquí: http://go.microsoft.com/fwlink/?LinkId=125889

Obviamente, esto va más allá de la pregunta original del OP, pero si no los configura a todos como seguros, puede esperar que una herramienta de escaneo de seguridad se dé cuenta y verá banderas rojas en el informe. Pregúntame cómo lo sé. :)

Jeff Mergler
fuente