Si te has hecho esta pregunta, entonces entiendo que vienes de leer el artículo sobre la Autorización con Cookies en .NET 6 y/o estás interesado/a en este método. En este tipo de autenticación, NET 6 te permite específicar el tipo de política «SameSite» para la Cookie pero, ¿qué significa esta política y cuándo debo usar SameSite Strict vs SameSite Lax?
Para entenderlo, primero tenemos que revisar qué son las cookies, y para ello voy a extraer la definición de las Políticas de Privacidad y Términos de Google:
Las cookies son pequeños fragmentos de texto que los sitios web que visitas envían al navegador. Permiten que los sitios web recuerden información sobre tu visita, lo que puede hacer que sea más fácil volver a visitar los sitios y hacer que estos te resulten más útiles.
Google- Privacidad y Términos
En el caso que nos ocupa respecto a la autentificación, lo que nos permite es recordar que un usuario concreto ha iniciado sesión y por tanto queremos mantener su sesión iniciada durante un determinado periodo; pues cada cookie tiene un dominio asociado. Y aunque esto sea así, en principio las Cookies viajan por todas las webs que vamos visitando, por lo que si inicias sesión en una, esa cookie se queda contigo aunque ya no estés en la web donde originalmente iniciaste sesión.
Aquí es donde empieza nuestro razonamiento sobre cómo debe actuar la nuestra Cookie de Autentificación en estos casos. Las cookies no están protegidas, por lo que son perfectamente accesibles para la web que estamos visitando. Por esta razón, una web con intenciones maliciosas podría crear un formulario que apuntase una petición a la web donde nos hemos identificado y, como tenemos una cookie, la web maliciosa podrá tener acceso a los datos porque parecerá como si nosotros hubiéramos hecho dicha solicitud. Este es un ataque que se conoce como XSRF o Cross-Site Request Forgery.
SameSite Strict
Si establecemos nuestras cookies con la propiedad:
opts.Cookie.SameSite = SameSiteMode.Strict;
Entonces estaremos diciéndole a la cookie que nunca se adjunte a una petición que venga de otro sitio que no sea la del dominio que la ha generado. Es decir, una cookie generada en la web «www.miweb.com» solo podrá ser usada mediante una petición dentro de esa misma web. Por lo que una petición de cualquier sitio web externo y malicioso no se llevará a cabo porque no estará autenticado en tu web y la cookie no se adjuntará.
Usando el ejemplo provisto por OWASP, para un sitio web similar a GitHub, esto significaría que si un usuario que inició sesión sigue un enlace a un proyecto privado de GitHub publicado en un foro de discusión corporativo o correo electrónico, GitHub no recibirá la cookie de sesión y el usuario no podrá para acceder al proyecto. Por otro lado, lo más probable es que la web de un banco no quiera permitir que se vinculen páginas transaccionales desde sitios externos, por lo que la configuración SameSite Strict sería la más apropiada aquí.
Otro punto a considerar es que esta configuración no permite el tipoo de autentificación por OAuth2 y el Single-Sign On (SSO) no funcionaría.
SameSite Lax
Esta es la configuración por defecto que usa .NET 6 si no estableces esta propiedad. Esta configuración proporciona un equilibrio razonable entre seguridad y facilidad de uso para los sitios web que desean mantener la sesión de inicio de sesión del usuario después de que el usuario llega desde un enlace externo.
Volviendo al ejemplo de GitHub anterior, la cookie de sesión se permitiría al seguir un enlace desde un sitio web externo. Luego nosotros podríamos añadir una capa de protección extra a los endpoints más propensos a sufrir CSRF (por ejemplo, POST), utilizando el Data Annotation [ValidateAntiForgeryToken].
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Post(IFormCollection collection)
{
// El proceso que toque
}
Los sitios web suelen integrar servicios externos con fines publicitarios, recomendaciones de contenido, widgets de terceros, inserciones de redes sociales y otras funciones. Cuando navegas por la Web, estos servicios externos pueden almacenar cookies en tu navegador y acceder a ellas para ofrecer experiencias personalizadas o medir la interacción de la audiencia. Cada cookie tiene un dominio asociado. Si el dominio asociado a una cookie coincide con un servicio externo y no con el sitio web que se muestra en la barra de direcciones del usuario, se considera que es un contexto de varios sitios (o de sitios de terceros).
A diferencia del caso anterior, aquí sí que funcionaría el OAuth2 y las peticiones de tipo GET desde otras web.