Compartir vía


Configurar un sitio web que usa servicios de aplicaciones (C#)

por Scott Mitchell

Nota:

Desde que se escribió este artículo, los proveedores de pertenencia a 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 que se escribió este artículo. ASP.NET Identity tiene una serie de ventajas sobre el 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

ASP.NET versión 2.0 introdujo una serie de servicios de aplicaciones, que forman parte de .NET Framework y sirven como conjunto de servicios de bloques de creación que puede usar para agregar funcionalidad enriquecida a una aplicación web. En este tutorial se explora cómo se configura un sitio web en el entorno de producción para usar servicios de aplicaciones y se abordan problemas comunes en la administración de cuentas de usuario y roles en el entorno de producción.

Introducción

ASP.NET versión 2.0 introdujo una serie de servicios de aplicaciones, que forman parte de .NET Framework y sirven como conjunto de servicios de bloques de creación que puede usar para agregar funcionalidad enriquecida a una aplicación web. Los servicios de aplicación incluyen:

  • Pertenencia: Una API para crear y administrar cuentas de usuario.
  • Roles: Una API para clasificar usuarios en grupos.
  • Perfil: Una API para almacenar contenido personalizado específico del usuario.
  • Mapa del sitio: Una API que define una estructura lógica del sitio en forma de jerarquía, que se puede mostrar a través de controles de navegación, como menús y rutas de navegación.
  • Personalización: Una API que mantiene las preferencias de personalización, que se suele usar con WebParts.
  • Supervisión del estado: Una API que supervisa el rendimiento, la seguridad, los errores y otras métricas de mantenimiento del sistema para una aplicación web en ejecución.

Las API de servicios de aplicación no están vinculadas a una implementación específica. En su lugar, se indica a los servicios de aplicación que usen un proveedor determinado y este implementa el servicio mediante una tecnología determinada. Los proveedores más usados para las aplicaciones web basadas en Internet hospedadas en una empresa de hospedaje web son aquellos proveedores que usan una implementación de base de datos de SQL Server. Por ejemplo, SqlMembershipProvider es un proveedor para la API de pertenencia que almacena información de la cuenta de usuario en una base de datos de Microsoft SQL Server.

El uso de los servicios de aplicación y los proveedores de SQL Server supone algunos desafíos al implementar la aplicación. En primer lugar, los objetos de base de datos de servicios de aplicaciones deben crearse correctamente en las bases de datos de desarrollo y producción e inicializar adecuadamente. También hay opciones de configuración importantes que deben hacerse.

Nota:

Las API de servicios de aplicaciones se diseñaron mediante el modelo de proveedor, un patrón de diseño que permite proporcionar los detalles de implementación de una API en runtime. .NET Framework incluye una serie de proveedores de servicios de aplicaciones que se pueden usar, como SqlMembershipProvider y SqlRoleProvider, que son proveedores para las API de pertenencia y roles que usan una implementación de base de datos de SQL Server. También puede crear y conectar un proveedor personalizado. De hecho, la aplicación web Críticas de libros ya contiene un proveedor personalizado para Site Map API (ReviewSiteMapProvider), que construye el mapa del sitio a partir de los datos de las tablas Genres y Books de la base de datos.

En este tutorial se comienza con un vistazo a cómo he ampliado la aplicación web Críticas de libros para usar las API de pertenencia y roles. Después verá la implementación de una aplicación web que usa servicios de aplicación con una implementación de base de datos de SQL Server y concluye abordando problemas comunes con la administración de cuentas de usuario y roles en el entorno de producción.

Actualizaciones de la aplicación Críticas de libros

En los últimos tutoriales, la aplicación web Críticas de libros se actualizó desde un sitio web estático a una aplicación web dinámica controlada por datos completa con un conjunto de páginas de administración para administrar géneros y opiniones. Pero esta sección de administración no está protegida actualmente: cualquier usuario que sepa (o adivine) la dirección URL de la página de administración puede entrar y crear, editar o eliminar revisiones en nuestro sitio. Una manera común de proteger determinadas partes de un sitio web es implementar cuentas de usuario y luego usar reglas de autorización de direcciones URL para restringir el acceso a determinados usuarios o roles. La aplicación web Críticas de libros disponible para descargar con este tutorial admite cuentas de usuario y roles. Tiene un único rol definido con el nombre administrador y solo los usuarios con este rol pueden acceder a las páginas de administración.

Nota:

He creado tres cuentas de usuario en la aplicación web Críticas de libros: Scott, Jisun y Alice. Los tres usuarios tienen la misma contraseña: contraseña! Scott y Jisun tienen el rol de administrador; Alice no. Las páginas que no son de administración del sitio siguen siendo accesibles para usuarios anónimos. Es decir, no es necesario iniciar sesión para visitar el sitio, a menos que quiera administrarlo, en cuyo caso debe iniciar sesión como usuario con el rol administrador.

La página maestra de la aplicación Críticas de libros se ha actualizado para incluir una interfaz de usuario diferente para usuarios autenticados y anónimos. Si un usuario anónimo visita el sitio, ve un vínculo de inicio de sesión en la esquina superior derecha. Un usuario autenticado ve el mensaje "Bienvenido de nuevo, username!" y un vínculo para cerrar sesión. También hay una página de inicio de sesión (~/Login.aspx), que contiene un control Web de inicio de sesión que proporciona la interfaz de usuario y la lógica para autenticar a un visitante. Los administradores son los únicos que pueden crear nuevas cuentas. (Hay páginas para crear y administrar cuentas de usuario en la carpeta ~/Admin).

Configuración de las API de pertenencia y roles

La aplicación web Críticas de libros usa las API de pertenencia y roles para admitir cuentas de usuario y agrupar esos usuarios en roles (es decir, en el rol de administrador). Las clases de proveedor SqlMembershipProvider y SqlRoleProvider se usan porque queremos almacenar información de cuentas y roles en una base de datos de SQL Server.

Nota:

Este tutorial no está pensado para ser un examen detallado en la configuración de una aplicación web para admitir las API de pertenencia y roles. Para obtener una visión exhaustiva de estas API y los pasos que debe seguir para configurar un sitio web para usarlos, lea mis tutoriales de seguridad de sitios web.

Para usar los servicios de aplicación con una base de datos de SQL Server, primero debe agregar los objetos de base de datos usados por estos proveedores a la base de datos donde quiere almacenar la información de la cuenta de usuario y del rol. Estos objetos de base de datos necesarios incluyen una variedad de tablas, vistas y procedimientos almacenados. A menos que se especifique lo contrario, las clases de proveedor SqlMembershipProvider y SqlRoleProvider usan una base de datos de SQL Server Express Edition denominada ASPNETDB ubicada en la carpeta de la aplicación App_Data. Si dicha base de datos no existe, se crea automáticamente con los objetos de base de datos necesarios por estos proveedores en tiempo de ejecución.

Es posible, y normalmente ideal, crear los objetos de base de datos de servicios de aplicación en la misma base de datos donde se almacenan los datos específicos de la aplicación del sitio web. .NET Framework incluye una herramienta denominada aspnet_regsql.exe que instala los objetos de base de datos en una base de datos especificada. He avanzado y usado esta herramienta para agregar estos objetos a la base de datos Reviews.mdf en la carpeta App_Data (la base de datos de desarrollo). Veremos cómo usar esta herramienta más adelante en este tutorial al agregar estos objetos a la base de datos de producción.

Si agrega los objetos de base de datos de servicios de aplicación a una base de datos distinta de ASPNETDB, necesitará personalizar las configuraciones de clases de proveedor SqlMembershipProvider y SqlRoleProvider para que usen la base de datos adecuada. Para personalizar el proveedor de pertenencia, agregue un <elemento> de pertenencia dentro de la <system.web> sección de Web.config; use el < elemento> roleManager para configurar el proveedor de roles. El fragmento de código siguiente se toma de Web.config de la aplicación Críticas de libros y muestra las opciones de configuración de las API de pertenencia y roles. Tenga en cuenta que ambos registran un nuevo proveedor (ReviewMembership y ReviewRole) que usan los proveedores SqlMembershipProvider y SqlRoleProvider, respectivamente.

<configuration>
    <system.web>
        ...

        <membership defaultProvider="ReviewMembership">
            <providers>
                <clear />

                <add type="System.Web.Security.SqlMembershipProvider" 
                     name="ReviewMembership" 
                     connectionStringName="ReviewsConnectionString" 
                     applicationName="BookReviews" />
            </providers>
        </membership>

        <roleManager enabled="true" defaultProvider="ReviewRole">
            <providers>
                <clear />

                <add type="System.Web.Security.SqlRoleProvider" 
                     name="ReviewRole" 
                     connectionStringName="ReviewsConnectionString" 
                     applicationName="BookReviews" />
            </providers>
        </roleManager>

        ...
    </system.web>
</configuration>

El elemento <authentication> del archivo Web.config también se ha configurado para admitir la autenticación basada en formularios.

<configuration>
    <system.web>
        ...

        <authentication mode="Forms" />

        ...
    </system.web>
</configuration>

Limitación del acceso a las páginas de Administración

ASP.NET facilita la concesión o denegación de acceso a un determinado archivo o carpeta por el usuario o por rol a través de su característica de autorización de direcciones URL. (Hemos analizado brevemente la autorización de direcciones URL en el tutorial de Diferencias principales entre IIS y el Servidor de desarrollo de ASP.NET (C#) y se ha mostrado cómo IIS y el Servidor de desarrollo de ASP.NET aplican reglas de autorización de direcciones URL de forma diferente para contenido estático y dinámico). Dado que se busca prohibir el acceso a la carpeta ~/Admin, excepto para los usuarios del rol administrador, es necesario agregar reglas de autorización de dirección URL a esta carpeta. En concreto, las reglas de autorización de direcciones URL deben permitir a los usuarios en el rol de administrador y denegarlo a todos los demás usuarios. Esto se logra agregando un archivo Web.config a la carpeta ~/Admin con el siguiente contenido:

<?xml version="1.0"?>
<configuration>
    <system.web>
        <authorization>
            <allow roles="Admin" />
            <deny users="*" />
        </authorization>
    </system.web>
</configuration>

Para obtener más información sobre la característica de autorización de direcciones URL de ASP.NET y cómo usarla para escribir reglas de autorización para usuarios y roles, asegúrese de leer los tutoriales Autorización basada en usuario (VB) yAutorización basada en roles (VB) de mis tutoriales de seguridad del sitio web.

Implementación de una aplicación web que usa servicios de aplicaciones

Al implementar un sitio web que usa servicios de aplicación y un proveedor que almacena la información de los servicios de aplicación en una base de datos, es imperativo que los objetos de base de datos necesarios para los servicios de aplicación se creen en la base de datos de producción. Inicialmente, la base de datos de producción no contiene estos objetos, por lo que cuando la aplicación se implementa por primera vez (o cuando se implementa por primera vez después de agregar los servicios de aplicación), debe completar pasos adicionales para obtener estos objetos de base de datos necesarios en la base de datos de producción.

Puede surgir otro problema al implementar un sitio web que use servicios de aplicación si piensa replicar las cuentas de usuario creadas en el entorno de desarrollo en el entorno de producción. En función de la configuración de pertenencia y roles, es posible que incluso si copia correctamente las cuentas de usuario creadas en el entorno de desarrollo en la base de datos de producción, estos usuarios no pueden iniciar sesión en la aplicación web en producción. Veremos la causa de este problema y analizaremos cómo evitar que suceda.

ASP.NET incluye una buena herramienta de administración de sitio web (WSAT) que se puede iniciar desde Visual Studio y permite administrar las reglas de autorización, roles y cuenta de usuario a través de una interfaz basada en la web. Desafortunadamente, la WSAT solo funciona en sitios web locales, lo que significa que no se puede usar para administrar de forma remota cuentas de usuario, roles y reglas de autorización para la aplicación web en el entorno de producción. Veremos diferentes maneras de implementar un comportamiento similar a WSAT desde su sitio web de producción.

Adición de objetos de base de datos mediante aspnet_regsql.exe

En el tutorial Implementación de una base de datos se mostró cómo copiar las tablas y los datos de la base de datos de desarrollo en la base de datos de producción, y estas técnicas se pueden usar para copiar los objetos de base de datos de servicios de aplicación en la base de datos de producción. Otra opción es la herramienta aspnet_regsql.exe, que agrega o quita los objetos de base de datos de servicios de aplicación de una base de datos.

Nota:

La herramienta aspnet_regsql.exe crea los objetos de base de datos en una base de datos especificada. No migra datos de esos objetos de la base de datos de desarrollo a la de producción. Si quiere copiar la información de rol y la cuenta de usuario de la base de datos de desarrollo en la base de datos de producción, use las técnicas que se describen en el tutorial Implementación de una base de datos.

Veamos cómo agregar los objetos de base de datos a la base de datos de producción mediante la herramienta aspnet_regsql.exe. Para empezar, abra el Explorador de Windows y vaya al directorio .NET Framework versión 2.0 del equipo, %WINDIR%\ Microsoft.NET\Framework\v2.0.50727. Allí debería encontrar la herramienta aspnet_regsql.exe. Esta herramienta se puede usar desde la línea de comandos, pero también incluye una interfaz gráfica de usuario. Haga doble clic en el archivo aspnet_regsql.exe para iniciar su componente gráfico.

La herramienta comienza mostrando una pantalla de presentación que explica su propósito. Seleccione Siguiente para avanzar a la pantalla "Seleccionar una opción de configuración", que se muestra en la ilustración 1. Desde aquí puede elegir agregar los objetos de base de datos de servicios de aplicación o quitarlos de una base de datos. Dado que queremos agregar estos objetos a la base de datos de producción, seleccione la opción "Configurar SQL Server para servicios de aplicaciones" y seleccione Siguiente.

Choose to Configure SQL Server for Application Services

Ilustración 1: Elija Configurar SQL Server para servicios de aplicaciones (Haga clic para ver la imagen a tamaño completo)

En la pantalla "Seleccionar el servidor y la base de datos" se solicita información para conectarse a la base de datos. Escriba el servidor de base de datos, las credenciales de seguridad y el nombre de la base de datos proporcionado por la empresa de hospedaje web y seleccione Siguiente.

Nota:

Después de escribir el servidor de base de datos y las credenciales, puede obtener un error al expandir la lista desplegable de la base de datos. La herramienta aspnet_regsql.exe consulta la tabla del sistema sysdatabases para recuperar una lista de bases de datos en el servidor, pero algunas empresas de hospedaje web bloquean sus servidores de bases de datos para que esta información no esté disponible públicamente. Si recibe este error, puede escribir el nombre de la base de datos directamente en la lista desplegable.

Supply the Tool With Your Database s Connection Information

Ilustración 2: Proporcione la herramienta con la Información de conexión de la base de datos (haga clic para ver la imagen a tamaño completo)

En la pantalla siguiente se resumen las acciones que están a punto de hacerse, es decir, que los objetos de base de datos de servicios de aplicación se van a agregar a la base de datos especificada. Seleccione Siguiente para completar esta acción. Después de unos instantes, se muestra la pantalla final, teniendo en cuenta que se han agregado los objetos de base de datos (consulte la ilustración 3).

Success! The Application Services Database Objects Were Added to the Production Database

Ilustración 3: ¡Correcto! Los objetos de base de datos de servicios de aplicación se agregaron a la base de datos de producción (haga clic para ver la imagen a tamaño completo).

Para comprobar que los objetos de base de datos de servicios de aplicación se agregaron correctamente a la base de datos de producción, abra SQL Server Management Studio y conéctese a la base de datos de producción. Como se muestra en la ilustración 4, ahora debería ver las tablas de base de datos de servicios de aplicación en la base de datos, aspnet_Applications, aspnet_Membership, aspnet_Users, etc.

Confirm That the Database Objects Were Added to the Production Database

Ilustración 4: Confirme que los objetos de base de datos se agregaron a la base de datos de producción (haga clic para ver la imagen a tamaño completo).

Solo tendrá que usar la herramienta aspnet_regsql.exe al implementar la aplicación web por primera vez o por primera vez después de haber empezado a usar los servicios de aplicación. Una vez que estos objetos de base de datos están en la base de datos de producción, no es necesario volver a agregarlos ni modificarlos.

Copia de cuentas de usuario de desarrollo a producción

Cuando se usan las clases de proveedor SqlMembershipProvider y SqlRoleProvider para almacenar la información de los servicios de aplicación en una base de datos de SQL Server, la cuenta de usuario y la información de rol se almacenan en una variedad de tablas de base de datos, como aspnet_Users, aspnet_Membership, aspnet_Roles y aspnet_UsersInRoles, entre otras. Si durante el desarrollo crea cuentas de usuario en el entorno de desarrollo, puede replicar esas cuentas de usuario en producción copiando los registros correspondientes de las tablas de base de datos aplicables. Si usó el Asistente para la publicación de bases de datos para implementar los objetos de base de datos de servicios de aplicación, también puede haber elegido copiar los registros, lo que daría lugar a que las cuentas de usuario creadas en desarrollo también estuvieran en producción. Pero en función de las opciones de configuración, es posible que encuentre que los usuarios cuyas cuentas se crearon en desarrollo y que se copiaron en producción no pueden iniciar sesión desde el sitio web de producción. ¿Qué ventajas aporta?

Las clases de proveedor SqlMembershipProvider y SqlRoleProvider se diseñaron de forma que una base de datos única pudiera servir como almacén de usuarios para varias aplicaciones, donde cada aplicación podría, en teoría, tener usuarios con nombres de usuario y roles superpuestos con el mismo nombre. Para permitir esta flexibilidad, la base de datos mantiene una lista de aplicaciones en la tabla aspnet_Applications y cada usuario está asociado a una. En concreto, la tabla aspnet_Users tiene una columna ApplicationId que vincula a cada usuario a un registro de la tabla aspnet_Applications.

Además de la columna ApplicationId, la tabla aspnet_Applications también incluye una columna ApplicationName, que proporciona un nombre más descriptivo para la aplicación. Cuando un sitio web intenta funcionar con una cuenta de usuario, como validar las credenciales de un usuario desde la página de inicio de sesión, debe indicar a la clase SqlMembershipProvider con qué aplicación trabajar. Normalmente, lo hace proporcionando el nombre de la aplicación y este valor procede de la configuración del proveedor en Web.config, específicamente a través del atributo applicationName.

Pero, ¿qué ocurre si el atributo applicationName no se especifica en Web.config? En tal caso, el sistema de pertenencia usa la ruta de acceso raíz de la aplicación como valor applicationName. Si el atributo applicationName no se establece explícitamente en Web.config, existe la posibilidad de que el entorno de desarrollo y el entorno de producción usen una raíz de aplicación diferente y, por tanto, se asociarán con nombres de aplicación diferentes en los servicios de aplicación. Si se produce un error de coincidencia, los usuarios creados en el entorno de desarrollo tendrán un valor ApplicationId que no coincide con el valor ApplicationId del entorno de producción. El resultado final es que esos usuarios no podrán iniciar sesión.

Nota:

Si se encuentra en esta situación, con cuentas de usuario copiadas en producción con un valor no coincidente ApplicationId, podría escribir una consulta para actualizar estos valores ApplicationId incorrectos al ApplicationId usado en producción. Una vez actualizada, los usuarios cuyas cuentas se crearon en el entorno de desarrollo ahora podrían iniciar sesión en la aplicación web en producción.

La buena noticia es que hay un paso sencillo que puede completarse para asegurarse de que los dos entornos usan el mismo ApplicationId: establezca explícitamente el atributo applicationName en Web.config para todos los proveedores de servicios de aplicaciones. He establecido explícitamente el atributo applicationName en "Críticas de libros" en los elementos <membership> y <roleManager> como se muestra en este fragmento de código Web.config.

<membership defaultProvider="ReviewMembership">
    <providers>
        <clear />

        <add type="System.Web.Security.SqlMembershipProvider" 
             name="ReviewMembership" 
             connectionStringName="ReviewsConnectionString" 
             applicationName="BookReviews" />
    </providers>
</membership>

Para obtener más información sobre cómo establecer el atributo applicationName y su justificación, consulte la entrada de blog de Guthrie, Always set the applicationName property when configuring ASP.NET Membership and other Providers(Establezca siempre la propiedad applicationName al configurar la pertenencia y otros proveedores de ASP.NET).

Administración de cuentas de usuario en el entorno de producción

La herramienta de administración de sitios web de ASP.NET (WSAT) facilita la creación y administración de cuentas de usuario, la definición y aplicación de roles y la descripción de las reglas de autorización basadas en roles y usuarios. Para iniciar la WSAT de Visual Studio, vaya al Explorador de soluciones y seleccione el icono de Configuración de ASP.NET o vaya a los menús Sitio web o Proyecto y seleccione el elemento del menú Configuración de ASP.NET. Desafortunadamente, la WSAT solo funciona con sitios web locales. Por lo tanto, no puede usar la WSAT desde la estación de trabajo para administrar el sitio web en el entorno de producción.

La buena noticia es que toda la funcionalidad expuesta por la WSAT está disponible mediante programación a través de las API de pertenencia y roles. Además, muchas de las pantallas de WSAT usan los controles estándar relacionados con el inicio de sesión ASP.NET. En resumen, puede agregar páginas de ASP.NET a un sitio web que ofrecen las funcionalidades de administración necesarias.

Recuerde que en un tutorial anterior se actualizó la aplicación web Críticas de libros para incluir una carpeta ~/Admin y esta carpeta se ha configurado para permitir solo a los usuarios en el rol de administrador. He agregado una página a esa carpeta denominada CreateAccount.aspx desde la que un administrador puede crear una nueva cuenta de usuario. En esta página se usa el control CreateUserWizard para mostrar la interfaz de usuario y la lógica de back-end para crear una nueva cuenta de usuario. Además, personalicé el control para incluir una CheckBox que pregunta si el nuevo usuario también debe agregarse al rol de administrador (consulte la ilustración 5). Con un poco de trabajo, puede crear un conjunto personalizado de páginas que implemente las tareas relacionadas con la administración de roles y el usuario que, de lo contrario, se proporcionaría mediante la WSAT.

Nota:

Para obtener más información sobre el uso de las API de pertenencia y roles junto con los controles web relacionados con el inicio de sesión de ASP.NET, asegúrese de leer mis tutoriales de seguridad del sitio web. Para obtener más información sobre cómo personalizar el control CreateUserWizard, consulte los tutoriales Crear cuentas de usuario (VB) y Almacenar información de usuario adicional (VB) o consulte el artículo de Erich Peterson, Personalización del control CreateUserWizard.

Administrators Can Create New User Accounts

Ilustración 5: los administradores pueden crear nuevas cuentas de usuario (haga clic para ver la imagen a tamaño completo)

Si necesita la funcionalidad completa de la WSAT, consulte Rolling Your Own Web Site Administration Tool (Poner en marcha su propia herramienta de administración de sitios web), en la que el autor Dan Clem aborda el proceso de la creación de una herramienta personalizada de tipo WSAT. Dan comparte el código fuente de su aplicación (en C#) y proporciona instrucciones paso a paso para agregarlo al sitio web hospedado.

Resumen

Al implementar una aplicación web que use la implementación de la base de datos de servicios de aplicaciones, primero debe asegurarse de que la base de datos de producción tenga los objetos de base de datos necesarios. Estos objetos se pueden agregar mediante las técnicas que se describen en el tutorial Implementación de una base de datos; como alternativa, puede usar la herramienta aspnet_regsql.exe, como se ha visto en este tutorial. Otros desafíos que hemos abordado sobre la sincronización del nombre de aplicación usado en los entornos de desarrollo y producción (lo que es importante si busca que los usuarios y roles creados en el entorno de desarrollo sean válidos en producción) y técnicas para administrar los usuarios y roles en el entorno de producción.

¡Feliz programación!

Lecturas adicionales

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