Conceptos básicos de seguridad y compatibilidad de ASP.NET (C#)

por Scott Mitchell

Nota:

Desde que se escribió este artículo, los proveedores de pertenencia de ASP.NET han sido reemplazados por ASP.NET Identity. Se recomienda encarecidamente actualizar las aplicaciones para usar la plataforma ASP.NET Identity en lugar de los proveedores de pertenencia destacados en el momento en el que se escribió este artículo. ASP.NET Identity ofrece una serie de ventajas frente al sistema de pertenencia ASP.NET, incluidas las siguientes:

  • Mejor rendimiento
  • Extensibilidad y capacidad de prueba mejoradas
  • Compatibilidad con OAuth, OpenID Connect y autenticación en dos fases
  • Compatibilidad con identidades basadas en notificaciones
  • Mejor interoperabilidad con ASP.Net Core

Descargar PDF

Este es el primer tutorial de una serie de tutoriales que explorarán técnicas para autenticar a los visitantes a través de un formulario web, autorizar el acceso a determinadas páginas y funcionalidades, y administrar cuentas de usuario en una aplicación de ASP.NET.

Introducción

¿Qué son los foros, sitios de comercio electrónico, sitios de correo electrónico en línea, sitios web de portal y sitios de redes sociales que todos tienen en común? Todas ofrecen cuentas de usuario. Los sitios que ofrecen cuentas de usuario deben proporcionar una serie de servicios. Como mínimo, los nuevos visitantes deben poder crear una cuenta y devolver visitantes deben poder iniciar sesión. Estas aplicaciones web pueden tomar decisiones basadas en el usuario que ha iniciado sesión: algunas páginas o acciones pueden estar restringidas solo a usuarios que han iniciado sesión o a un determinado subconjunto de usuarios; otras páginas pueden mostrar información específica del usuario que ha iniciado sesión o puede mostrar más o menos información, dependiendo de qué usuario esté viendo la página.

Este es el primer tutorial de una serie de tutoriales que explorarán técnicas para autenticar a los visitantes a través de un formulario web, autorizar el acceso a determinadas páginas y funcionalidades, y administrar cuentas de usuario en una aplicación de ASP.NET. En el transcurso de estos tutoriales examinaremos cómo:

  • Identificación e inicio de sesión de usuarios en un sitio web
  • Use ASP. Marco de pertenencia de NET para administrar cuentas de usuario
  • Creación, actualización y eliminación de cuentas de usuario
  • Limitar el acceso a una página web, un directorio o una funcionalidad específica basada en el usuario que ha iniciado sesión
  • Use ASP. Marco de roles de NET para asociar cuentas de usuario con roles
  • Administrar los roles de usuario
  • Limitar el acceso a una página web, un directorio o una funcionalidad específica en función del rol del usuario que ha iniciado sesión
  • Personalice y extienda ASP. Controles web de seguridad de NET

Estos tutoriales están orientados a ser concisos y proporcionan instrucciones paso a paso con una gran cantidad de capturas de pantalla para guiarle visualmente por el proceso. Cada tutorial está disponible en las versiones de C# y Visual Basic e incluye una descarga del código completo usado. (Este primer tutorial se centra en los conceptos de seguridad desde un punto de vista de alto nivel y, por lo tanto, no contiene ningún código asociado.)

En este tutorial analizaremos conceptos de seguridad importantes y qué instalaciones están disponibles en ASP.NET para ayudar a implementar la autenticación, autorización, cuentas de usuario y roles de formularios. Comencemos.

Nota:

La seguridad es un aspecto importante de cualquier aplicación que abarque decisiones físicas, tecnológicas y políticas, y requiere un alto grado de planificación y conocimiento de dominio. Esta serie de tutoriales no está pensada como guía para desarrollar aplicaciones web seguras. En su lugar, se centra específicamente en la autenticación, autorización, cuentas de usuario y roles de formularios. Aunque algunos conceptos de seguridad que giran en torno a estos problemas se describen en esta serie, otros se dejan inexplorados.

Autenticación, autorización, cuentas de usuario y roles

La autenticación, la autorización, las cuentas de usuario y los roles son cuatro términos que se usarán con mucha frecuencia en esta serie de tutoriales, por lo que me gustaría tomar un momento rápido para definir estos términos en el contexto de la seguridad web. En un modelo de servidor cliente, como Internet, hay muchos escenarios en los que el servidor debe identificar al cliente que realiza la solicitud. Autenticación es el proceso de determinar la identidad del cliente. Se dice que un cliente que se ha identificado correctamente es autenticado. Se dice que un cliente no identificado no está autenticado o anónimo.

Los sistemas de autenticación seguros implican al menos una de las tres facetas siguientes: algo que sepa, algo que tenga o algo que esté. La mayoría de las aplicaciones web se basan en algo que el cliente conoce, como una contraseña o un PIN. La información que se usa para identificar a un usuario (su nombre de usuario y contraseña, por ejemplo) se conoce como credenciales. Esta serie de tutoriales se centra en autenticación de formularios, que es un modelo de autenticación en el que los usuarios inician sesión en el sitio proporcionando sus credenciales en un formulario de página web. Todos hemos experimentado este tipo de autenticación antes. Ve a cualquier sitio de comercio electrónico. Cuando esté listo para desactive el registro, escriba el nombre de usuario y la contraseña en los cuadros de texto de una página web.

Además de identificar clientes, es posible que un servidor tenga que limitar los recursos o funcionalidades a los que se puede acceder en función del cliente que realiza la solicitud. Autorización es el proceso de determinar si un usuario determinado tiene la autoridad para acceder a un recurso o una funcionalidad específicos.

Una cuenta de usuario es un almacén para conservar información sobre un usuario determinado. Las cuentas de usuario deben incluir mínimamente información que identifique de forma única al usuario, como el nombre de inicio de sesión y la contraseña del usuario. Junto con esta información esencial, las cuentas de usuario pueden incluir cosas como: la dirección de correo electrónico del usuario; la fecha y hora en que se creó la cuenta; la fecha y hora en que iniciaron sesión por última vez; nombre y apellidos; número de teléfono; y dirección postal. Al usar la autenticación de formularios, la información de la cuenta de usuario se almacena normalmente en una base de datos relacional como Microsoft SQL Server.

Las aplicaciones web que admiten cuentas de usuario pueden agrupar a los usuarios opcionalmente en roles. Un rol es simplemente una etiqueta que se aplica a un usuario y proporciona una abstracción para definir reglas de autorización y funcionalidad de nivel de página. Por ejemplo, un sitio web podría incluir un rol de administrador con reglas de autorización que prohíben a cualquier persona, pero un administrador acceder a un conjunto determinado de páginas web. Además, una variedad de páginas accesibles para todos los usuarios (incluidos los que no son administradores) puede mostrar datos adicionales o ofrecer funcionalidad adicional cuando los usuarios visitan el rol Administradores. Con los roles, podemos definir estas reglas de autorización por rol en lugar de usuario por usuario.

Autenticación de usuarios en una aplicación de ASP.NET

Cuando un usuario escribe una dirección URL en la ventana de direcciones del explorador o hace clic en un vínculo, el explorador realiza un Protocolo de transferencia de hipertexto (HTTP) solicitud al servidor web para el contenido especificado, ya sea una página de ASP.NET, una imagen, un archivo JavaScript o cualquier otro tipo de contenido. El servidor web se encarga de devolver el contenido solicitado. Al hacerlo, debe determinar varias cosas sobre la solicitud, incluido quién realizó la solicitud y si la identidad está autorizada para recuperar el contenido solicitado.

De forma predeterminada, los exploradores envían solicitudes HTTP que carecen de cualquier tipo de información de identificación. Pero si el explorador incluye información de autenticación, el servidor web inicia el flujo de trabajo de autenticación, lo que intenta identificar al cliente que realiza la solicitud. Los pasos del flujo de trabajo de autenticación dependen del tipo de autenticación que usa la aplicación web. ASP.NET admite tres tipos de autenticación: Windows, Passport y formularios. Esta serie de tutoriales se centra en la autenticación de formularios, pero vamos a tardar un minuto en comparar y contrastar autenticación de Windows almacenes de usuarios y flujo de trabajo.

Autenticación a través de la autenticación de Windows

El flujo de trabajo de autenticación de Windows usa una de las siguientes técnicas de autenticación:

  • Autenticación básica
  • Autenticación implícita
  • Autenticación integrada de Windows

Las tres técnicas funcionan aproximadamente de la misma manera: cuando llega una solicitud anónima no autorizada, el servidor web envía una respuesta HTTP que indica que se requiere autorización para continuar. A continuación, el explorador muestra un cuadro de diálogo modal que solicita al usuario su nombre de usuario y contraseña (vea la figura 1). A continuación, esta información se devuelve al servidor web a través de un encabezado HTTP.

A Modal Dialog Box Prompts the User for His Credentials

Figura 1: Un cuadro de diálogo modal solicita al usuario sus credenciales

Las credenciales proporcionadas se validan en el Almacén de usuarios de Windows del servidor web. Esto significa que cada usuario autenticado de la aplicación web debe tener una cuenta de Windows en su organización. Esto es habitual en escenarios de intranet. De hecho, cuando se usa la autenticación integrada de Windows en una configuración de intranet, el explorador proporciona automáticamente al servidor web las credenciales usadas para iniciar sesión en la red, suprimiendo así el cuadro de diálogo que se muestra en la figura 1. Aunque la autenticación de Windows es excelente para las aplicaciones de intranet, normalmente no es factible para las aplicaciones de Internet, ya que no desea crear cuentas de Windows para cada usuario que se registre en su sitio.

Autenticación mediante autenticación de formularios

Por otro lado, la autenticación de formularios es ideal para aplicaciones web de Internet. Recuerde que la autenticación de formularios identifica al usuario pidiéndole que escriba sus credenciales a través de un formulario web. Por lo tanto, cuando un usuario intenta acceder a un recurso no autorizado, se le redirige automáticamente a la página de inicio de sesión donde puede escribir sus credenciales. A continuación, las credenciales enviadas se validan en un almacén de usuarios personalizado, normalmente una base de datos.

Después de comprobar las credenciales enviadas, se crea un vale de autenticación de formularios para el usuario. Este vale indica que el usuario se ha autenticado e incluye información de identificación, como el nombre de usuario. El vale de autenticación de formularios se almacena (normalmente) como una cookie en el equipo cliente. Por lo tanto, las visitas posteriores al sitio web incluyen el vale de autenticación de formularios en la solicitud HTTP, lo que permite que la aplicación web identifique al usuario una vez que haya iniciado sesión.

En la figura 2 se muestra el flujo de trabajo de autenticación de formularios desde un punto de vista de alto nivel. Observe cómo las partes de autenticación y autorización de ASP.NET actúan como dos entidades independientes. El sistema de autenticación de formularios identifica al usuario (o informes que son anónimos). El sistema de autorización es lo que determina si el usuario tiene acceso al recurso solicitado. Si el usuario no está autorizado (como se encuentra en la figura 2 al intentar visitar de forma anónima ProtectedPage.aspx), el sistema de autorización informa de que se deniega el usuario, lo que hace que el sistema de autenticación de formularios redirija automáticamente al usuario a la página de inicio de sesión.

Una vez que el usuario haya iniciado sesión correctamente, las solicitudes HTTP posteriores incluyen el vale de autenticación de formularios. El sistema de autenticación de formularios simplemente identifica al usuario: es el sistema de autorización que determina si el usuario puede acceder al recurso solicitado.

The Forms Authentication Workflow

Figura 2: Flujo de trabajo de autenticación de formularios

Profundizaremos en la autenticación de formularios con mucho más detalle en el siguiente tutorial,Una introducción a la autenticación de formularios. Para obtener más información sobre ASP.NET, las opciones de autenticación, veaASP.NET Autenticación.

Limitar el acceso a páginas web, directorios y funcionalidad de página

ASP.NET incluye dos maneras de determinar si un usuario determinado tiene autoridad para acceder a un archivo o directorio específico:

  • Autorización de archivos: dado que ASP.NET páginas y servicios web se implementan como archivos que residen en el sistema de archivos del servidor web, el acceso a estos archivos se puede especificar a través de listas de control de acceso (ACL). La autorización de archivos se usa normalmente con la autenticación de Windows porque las ACL son permisos que se aplican a las cuentas de Windows. Al usar la autenticación de formularios, todas las solicitudes de sistema operativo y de nivel de sistema de archivos se ejecutan mediante la misma cuenta de Windows, independientemente del usuario que visite el sitio.
  • Autorización de dirección URL: con autorización de dirección URL, el desarrollador de páginas especifica reglas de autorización en Web.config. Estas reglas de autorización especifican a qué usuarios o roles se les permite acceder o se les deniega el acceso a determinadas páginas o directorios de la aplicación.

La autorización de archivos y la autorización URL definen reglas de autorización para acceder a una página de ASP.NET determinada o para todas las páginas de ASP.NET de un directorio determinado. Con estas técnicas podemos indicar a ASP.NET denegar solicitudes a una página determinada para un usuario determinado o permitir el acceso a un conjunto de usuarios y denegar el acceso a todos los demás. ¿Qué ocurre con los escenarios en los que todos los usuarios pueden acceder a la página, pero la funcionalidad de la página depende del usuario? Por ejemplo, muchos sitios que admiten cuentas de usuario tienen páginas que muestran contenido o datos diferentes para usuarios autenticados frente a usuarios anónimos. Un usuario anónimo podría ver un vínculo para iniciar sesión en el sitio, mientras que un usuario autenticado en su lugar vería un mensaje como, Bienvenido de nuevo, Nombre de usuario junto con un vínculo para cerrar sesión. Otro ejemplo: al ver un artículo en un sitio de subastas, verá información diferente en función de si es un pujador o el que subasta el artículo.

Estos ajustes de nivel de página se pueden realizar mediante declaración o mediante programación. Para mostrar contenido diferente para usuarios anónimos que los usuarios autenticados, basta con arrastrar un control LoginView a la página y escribir el contenido adecuado en sus plantillas AnonymousTemplate y LoggedInTemplate. Como alternativa, puede determinar mediante programación si la solicitud actual está autenticada, quién es el usuario y a qué roles pertenecen (si los hay). Puede usar esta información para mostrar u ocultar columnas en una cuadrícula o paneles de la página.

Esta serie incluye tres tutoriales que se centran en la autorización. Autorización basada en usuariosexamina cómo limitar el acceso a una página o páginas de un directorio para cuentas de usuario específicas; Autorización basada en roles examina el suministro de reglas de autorización en el nivel de rol; por último, el Mostrar contenido basado en el tutorial usuario que ha iniciado sesión actualmente explora la modificación del contenido y la funcionalidad de una página determinada en función del usuario que visita la página. Para obtener más información sobre ASP.NET, Las opciones de autorización, vea ASP.NET autorización.

Cuentas de usuario y roles

La autenticación de formularios de ASP.NET proporciona una infraestructura para que los usuarios inicien sesión en un sitio y tengan su estado autenticado recordado en las visitas de página. Y la autorización de direcciones URL ofrece un marco para limitar el acceso a archivos o carpetas específicos en una aplicación de ASP.NET. Sin embargo, ninguna característica proporciona un medio para almacenar información de la cuenta de usuario o administrar roles.

Antes de ASP.NET 2.0, los desarrolladores eran responsables de crear sus propios almacenes de roles y usuarios. También estaban en el enlace para diseñar las interfaces de usuario y escribir el código para páginas esenciales relacionadas con la cuenta de usuario, como la página de inicio de sesión y la página para crear una nueva cuenta, entre otras. Sin ningún marco de cuentas de usuario integrado en ASP.NET, cada desarrollador que implementa cuentas de usuario tenía que llegar a sus propias decisiones de diseño sobre preguntas como, ¿Cómo puedo almacenar contraseñas u otra información confidencial? y ¿Qué directrices debo imponer con respecto a la longitud y la seguridad de la contraseña?

Hoy en día, la implementación de cuentas de usuario en una aplicación de ASP.NET es mucho más sencilla gracias al marco de pertenencia y los controles web de inicio de sesión integrados. El marco de pertenencia es una serie de clases en el espacio de nombres System.Web.Security que proporciona funcionalidad para realizar tareas esenciales relacionadas con la cuenta de usuario. La clase clave del marco de pertenencia es la clase de pertenencia, que tiene métodos como:

  • CreateUser
  • DeleteUser
  • GetAllUsers
  • GetUser
  • UpdateUser
  • ValidateUser

El marco de pertenencia usa el modelo de proveedor, que separa limpiamente la API del marco de pertenencia de su implementación. Esto permite a los desarrolladores usar una API común, pero les permite usar una implementación que satisfaga las necesidades personalizadas de su aplicación. En resumen, la clase de pertenencia define la funcionalidad esencial del marco (los métodos, propiedades y eventos), pero realmente no proporciona ningún detalle de implementación. En su lugar, los métodos de la clase de pertenencia invocan al proveedor configurado, que es lo que realiza el trabajo real. Por ejemplo, cuando se invoca el método CreateUser de la clase de pertenencia, la clase de pertenencia no conoce los detalles del almacén de usuarios. No sabe si los usuarios se mantienen en una base de datos o en un archivo XML o en algún otro almacén. La clase de pertenencia examina la configuración de la aplicación web para determinar a qué proveedor delegar la llamada y esa clase de proveedor es responsable de crear realmente la nueva cuenta de usuario en el almacén de usuarios adecuado. Esta interacción se muestra en la figura 3.

Microsoft incluye dos clases de proveedor de pertenencia en .NET Framework:

Esta serie de tutoriales se centra exclusivamente en SqlMembershipProvider.

The Provider Model Enables Different Implementations to be Seamlessly Plugged Into the Framework</strong>

Figura 03: El modelo de proveedor permite que las distintas implementaciones se conecten sin problemas al marco (Haga clic para ver la imagen de tamaño completo)

La ventaja del modelo de proveedor es que Microsoft, proveedores de terceros o desarrolladores individuales pueden desarrollar implementaciones alternativas y conectar sin problemas al marco de pertenencia. Por ejemplo, Microsoft ha publicado un proveedor de pertenencia para bases de datos de Microsoft Access. Para obtener más información sobre los proveedores de pertenencia, vea el Kit de herramientas de proveedores, que incluye un tutorial de los proveedores de pertenencia, proveedores personalizados de ejemplo, más de 100 páginas de documentación sobre el modelo de proveedor y el código fuente completo para los proveedores de pertenencia integrados (es decir, ActiveDirectoryMembershipProvider y SqlMembershipProvider).

ASP.NET 2.0 también introdujo el marco roles. Al igual que el marco de pertenencia, el marco roles se compila sobre el modelo de proveedor. Su API se expone a través de la clase Roles y .NET Framework se incluye con tres clases de proveedor:

  • AuthorizationStoreRoleProvider: administra la información de roles en un almacén de directivas de authorization-manager, como Active Directory o ADAM.
  • SqlRoleProvider: implementa roles en una base de datos de SQL Server.
  • WindowsTokenRoleProvider: asocia información de roles basada en el grupo de Windows del visitante. Este método se usa normalmente con la autenticación de Windows.

Esta serie de tutoriales se centra exclusivamente en SqlRoleProvider.

Dado que el modelo de proveedor incluye una API orientada a un solo avance (las clases pertenencia y roles), es posible crear funcionalidades en torno a esa API sin tener que preocuparse de los detalles de implementación: los proveedores seleccionados por el desarrollador de páginas administran los mismos. Esta API unificada permite que Microsoft y proveedores de terceros compilen controles web en interfaz con los marcos de pertenencia y roles. ASP.NET se incluye con una serie de controles Web de inicio de sesión para implementar interfaces de usuario comunes de cuentas de usuario. Por ejemplo, el control de inicio de sesión solicita a un usuario sus credenciales, los valida y, a continuación, los registra a través de la autenticación de formularios. El control LoginView ofrece plantillas para mostrar diferentes marcados a usuarios anónimos frente a usuarios autenticados o marcados diferentes en función del rol del usuario. Además, el control CreateUserWizard proporciona una interfaz de usuario paso a paso para crear una nueva cuenta de usuario.

Debajo se describen los distintos controles de inicio de sesión que interactúan con los marcos de pertenencia y roles. La mayoría de los controles de inicio de sesión se pueden implementar sin tener que escribir una sola línea de código. Examinaremos estos controles con más detalle en los tutoriales futuros, incluidas las técnicas para ampliar y personalizar su funcionalidad.

Resumen

Todas las aplicaciones web que admiten cuentas de usuario requieren características similares, como: la capacidad de que los usuarios inicien sesión y tengan su estado de inicio de sesión recordado en las visitas a la página; una página web para que los nuevos visitantes creen una cuenta; y la capacidad del desarrollador de páginas para especificar qué recurso, datos y funcionalidad están disponibles para qué usuarios o roles. Las tareas de autenticación y autorización de usuarios y de administración de cuentas y roles de usuario son muy fáciles de lograr en ASP.NET aplicaciones gracias a la autenticación de formularios, la autorización de direcciones URL y los marcos de pertenencia y roles.

A lo largo de los siguientes tutoriales, examinaremos estos aspectos mediante la creación de una aplicación web de trabajo desde cero de forma paso a paso. En el siguiente tutorial exploraremos detalladamente la autenticación de formularios. Veremos el flujo de trabajo de autenticación de formularios en acción, desactive el vale de autenticación de formularios, analice los problemas de seguridad y vea cómo configurar el sistema de autenticación de formularios, todo ello al crear una aplicación web que permita a los visitantes iniciar sesión y cerrar sesión.

¡Feliz programación!

Lecturas adicionales

Para obtener más información sobre los temas tratados en este tutorial, consulte los siguientes recursos:

Acerca del autor

Scott Mitchell, autor de siete libros de ASP/ASP.NET y fundador de 4GuysFromRolla.com, ha estado trabajando con tecnologías web de Microsoft desde 1998. Scott trabaja como consultor independiente, entrenador y escritor. Su último libro es Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Puede llegar a mitchell@4GuysFromRolla.com. o a través de su blog, que se puede encontrar en http://ScottOnWriting.NET.

Agradecimientos especiales a

Esta serie de tutoriales fue revisada por muchos revisores que fueron de gran ayuda. El revisor principal de este tutorial fue esta serie de tutoriales fue revisada por muchos revisores útiles. Entre los revisores principales de este tutorial están Alicja Maziarz, John Suru y Teresa Murphy. ¿Le interesaría revisar mis próximos artículos de MSDN? Si es así, escríbame a mitchell@4GuysFromRolla.com.