¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. ASP.NET Core MVC
  3. Seguridad
Extrait - ASP.NET Core MVC Domine este potente framework web abierto y multiplataforma
Extractos del libro
ASP.NET Core MVC Domine este potente framework web abierto y multiplataforma Volver a la página de compra del libro

Seguridad

Introducción

La seguridad de un sistema de información es esencial para garantizar la confidencialidad de los datos expuestos al usuario y evitar que un descuidado pueda operar en el sistema y dañar la integridad de los datos de la empresa. El acceso a las páginas, el acceso a los datos y la protección de datos, son cuestiones delicadas que el desarrollador debe tener en cuenta a la hora de desarrollar el sitio web.

La seguridad del sistema plantea una serie de cuestiones: ¿quién tiene acceso a una página determinada? Una vez generada la página, ¿quién tiene derecho a ver los datos? ¿Trabaja el usuario con una serie concreta de datos? ¿Un usuario tiene derecho a ver los datos de otro? ¿Cómo se pueden almacenar de forma segura los datos confidenciales en la estación de trabajo del usuario? ASP.NET Core ofrece una respuesta sofisticada a estas preguntas, sin perder de vista la naturaleza modular del framework, a través de varias API.

El primer aspecto tratado en este capítulo se refiere a la autenticación mediante Identity. Responde a la siguiente pregunta: ¿cómo gestionar un sistema completo de autenticación para el sitio web? El segundo tema es la autorización: ¿cómo gestionar de forma segura el acceso a los datos? Por último, el capítulo aborda las estrategias de protección...

Autenticación y API Identity

ASP.NET Core Identity es un framework de autenticación extremadamente completo y abierto, con innumerables mecanismos para el inicio de sesión de los usuarios, el envío de correos electrónicos de validación, el registro en el sitio web, la verificación por SMS, etc. Identity se basa en tres puntos principales:

  • proporcionan una capa de abstracción entre la aplicación y el almacenamiento del usuario,

  • proporcionan mecanismos sencillos y listos para usar que reducen la carga de trabajo del desarrollador a la hora de gestionar la autenticación,

  • se abre a sistemas de autenticación externos como Facebook o Google.

Identity debe ser la interfaz seleccionada entre el sistema de información y la autenticación de los usuarios. ASP.NET Core Identity se encuentra ahora en su tercera versión y se ha rediseñado por completo, para ofrecer una apertura sin igual. En la configuración por defecto de las plantillas de Visual Studio, Identity se utiliza con Entity Framework Core y SQL Server. A continuación, se muestra cómo se configura en la clase Startup:

services.AddIdentity<ApplicationUser, IdentityRole>()  
        .AddEntityFrameworkStores<ApplicationDbContext>()  
        .AddDefaultTokenProviders(); 

Identity también se basa en middleware para autenticar cada petición HTTP entrante:

app.UseIdentity(); 

La dependencia clave para utilizar Identity es Microsoft.AspNetCore.Identity. Esto le permite utilizar todos los métodos de extensión necesarios para configurar Identity de la mejor manera posible.

La primera clase importante con Identity es la clase UserManager<TUser>. Proporciona una gestión de alto nivel de los usuarios del sistema de información, incluida:

  • Una gestión clásica de usuarios (búsqueda, inserción, actualización, etc.) mediante métodos como Create, Update o FindByName. En función del método, se devuelve un resultado en forma de objeto IdentityResult, que indica si la operación se ha realizado correctamente.

var user = new ApplicationUser {   
          UserName = model.Email,   
          Email...

Autorizaciones

Las autorizaciones son los procesos que determinan si un usuario tiene o no derecho a realizar una determinada acción. El sistema de autorización es completamente independiente del sistema de autenticación, lo que facilita la desvinculación de los módulos del sistema web. El namespace importante aquí es Microsoft.AspNetCore.Authorization.

ASP.NET Core distingue entre varios conceptos de autorización dentro de su framework:

  • La autorización simple, que responde simplemente a la pregunta: ¿estoy conectado al sitio?

  • Autorización basada en funciones.

  • Autorización basada en claims. Por ejemplo, el usuario debe ser empleado de la empresa (y no cliente, por ejemplo) antes de acceder a determinadas páginas. 

  • Autorización basada en policy. Un ejemplo sería la edad mínima requerida para acceder a la página solicitada.

  • Autorización basada en recursos: ¿tengo derecho a ver este documento? ¿tengo derecho a modificar este documento?

  • Autorización basada en la vista: ¿tengo derecho a acceder al botón que me permite modificar este registro?

El resto de esta sección detallará e ilustrará cada uno de estos conceptos con ejemplos de código.

La autorización simple es el modo de autorización más sencillo: simplemente comprueba que el usuario está autenticado para acceder a la página. Para ello, el desarrollador simplemente utiliza el atributo [Authorize] en sus controladores o acciones (o ambos).

[Authorize] 
public class MyController : Controller 
{  
    public ActionResult Index(){}  
    public ActionResult Create(){}  
    public ActionResult Update(){}  
    public ActionResult GetSingle(){}  
} 

La ventaja de añadir atributos a los controladores y acciones es que puede afinar las autorizaciones. Existe otro atributo que permite a cualquier usuario acceder a la página: [AllowAnonymous]. Entonces es posible bloquear todo un controlador, excepto una acción en particular.

[Authorize]  
public class MyController : Controller  
{  
    public ActionResult Index(){}  ...

Protección de datos

Un sitio web necesita poder almacenar datos sensibles en la máquina del cliente y obviamente esto plantea una serie de problemas de seguridad: ¿cómo cifrar los datos correctamente? ¿Cómo garantizar que los datos devueltos por el cliente no han sido alterados? Estas preguntas giran en torno a tres cuestiones clave:

  • la autenticidad de los datos transmitidos al cliente,

  • confidencialidad de los datos,

  • aislar los datos para evitar en lo posible su alteración.

El equipo de ASP.NET Core responsable del API de protección de datos ha revisado por completo la implementación de este API, teniendo en cuenta:

  • simplicidad de configuración del API. Se debe poder utilizar sin ninguna configuración previa,

  • facilidad de uso,

  • la no complejidad de los principios utilizados en el API. El desarrollador debe poder utilizar los sistemas de seguridad sin tener que conocer los algoritmos de cifrado.

El resultado es un API de protección de datos totalmente nuevo, ultramodular y configurable a varios niveles según las necesidades del desarrollador. Las distintas API se denominan de la siguiente manera:

  • Consumer API: API de alto nivel que permite utilizar fácilmente el sistema de protección de datos con la configuración predeterminada.

  • Configuration API: API para configurar el sistema de protección, lo que permite afinar el mecanismo.

  • Extensibility API: API de bajo nivel que permite sustituir y volver a implementar la mayor parte del mecanismo de protección de datos.

Existen varios espacios de nombres dentro de este sistema. En primer lugar, Microsoft.AspNetCore.DataProtection.Abstractions contiene todas las abstracciones e interfaces que los desarrolladores pueden utilizar mediante inyección de dependencias o que pueden implementar para ofrecer su propio sistema de protección. A continuación está Microsoft.AspNetCore.DataProtection, que proporciona una implementación básica del sistema para operaciones criptográficas, configuración, gestión de claves, etc. Le sigue Microsoft.AspNetCore.DataProtection.Extensions, que expone algunos métodos de extensión útiles para los desarrolladores. Por último, está Microsoft.AspNetCore.DataProtection.SystemWeb, que permite utilizar el nuevo mecanismo de protección en proyectos ASP.NET más...

Gestión de CORS

CORS es el acrónimo de Cross Origin Resource Sharing. Para entender bien este concepto, es importante recordar que a los navegadores no se les permite hacer llamadas AJAX en dominios que no sean el suyo propio, por razones de seguridad. Esto se conoce como same-origin policy. Esto evita que los sitios web maliciosos lean datos sensibles en otros sitios, en particular a través de Web API. Sin embargo, en el contexto de la comunicación entre sistemas web, esto plantea un problema. ¿Cómo puede un sitio web que supuestamente se comunica con otro sistema web para intercambiar datos, recuperar información si el navegador no autoriza este tipo de llamada? La norma del W3C lo ha previsto todo con CORS.

Esta cuestión está cobrando protagonismo estos días con la interconexión de los sistemas web. Para facilitar el intercambio de datos, los sitios web se llaman automáticamente entre sí a través de servicios web y otras API.

Pero al final, ¿qué entendemos por "el mismo origen"? Dos recursos tienen el mismo origen si el esquema de URL, el host y el puerto, son iguales. Por ejemplo, las siguientes URL tienen el mismo origen:

  • http://misitio.com/recurso1.html.

  • http://misitio.com/miestilo2.css.

  • http://misitio.com/miimagen.jpg.

Sin embargo, las siguientes URL no tienen el mismo origen:

  • http://misitio.net: dominio diferente.

  • http://misitio.com:9000/recurso1.html:...

Seguridad mediante OAuth 2.0

OAuth 2.0 es un protocolo de autorización desarrollado por el grupo de trabajo OAuth del Internet Engineering Task Force (IETF). OAuth 2.0 se publicó en octubre de 2012 como actualización de la primera versión del protocolo OAuth, que se publicó en abril de 2010.

El objetivo de OAuth 2.0 es proporcionar a los usuarios un modo de dar a un terceroacceso limitado a sus recursos en línea, sin compartir sus credenciales. Esto permite a los usuarios dar a aplicaciones de terceros, acceso a sus datos, como contactos, fotos y calendarios, en servicios en línea como Google y Facebook, sin compartir sus contraseñas con estas aplicaciones.

Hay varias partes interesadas en un proceso de autenticación OAuth 2.0:

  • El usuario: el usuario es la persona que desea acceder a un recurso en línea protegido por OAuth 2.0.

  • El cliente: el cliente es la aplicación que solicita acceso al recurso del usuario. El cliente puede ser una aplicación web, una aplicación móvil o cualquier otra aplicación que desee acceder al recurso del usuario.

  • El servidor de identidad: el servidor de identidad es el servicio que protege el recurso del usuario y gestiona las peticiones de acceso del cliente. También gestiona las peticiones de autorización del cliente y emite un token de acceso al cliente, cuando el usuario concede la autorización.

  • El recurso: el recurso es el dato o servicio al que el cliente desea acceder y que está protegido por OAuth 2.0. En general, es el API protegido por el servidor de identidad.

Dentro del protocolo OAuth 2.0, existen varios flujos de autenticación en función de la situación: ¿el cliente es una aplicación web o móvil? ¿Necesitamos asegurar la comunicación máquina a máquina? ¿El API es público o privada? ¿La empresa controla a los clientes del API?

Aquí explicaremos los flujos Authorization code y Client credentials, que son los mecanismos de autenticación más comunes.

El primer flujo es el flujo Authorization code flow. Es el flujo más utilizado en aplicaciones web y móviles y se utiliza para asegurar un recurso al que el cliente desea acceder. Este es el flujo de autenticación:

1.

El cliente (web o móvil) intenta acceder a un recurso API protegido por el servidor de identidad...