Pertenencia

de Microsoft

Nota:

Desde que se escribió este artículo, los proveedores de pertenencia de ASP.NET se han reemplazado por ASP.NET Identity. Se recomienda encarecidamente actualizar las aplicaciones para usar la plataformaASP.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

La pertenencia de ASP.NET se basa en el éxito del modelo de autenticación de formularios a partir de ASP.NET 1.x. La autenticación de formularios de ASP.NET proporciona una manera cómoda de incorporar un formulario de inicio de sesión en la aplicación de ASP.NET y de validar a los usuarios en una base de datos u otro almacén de datos.

La pertenencia de ASP.NET se basa en el éxito del modelo de autenticación de formularios a partir de ASP.NET 1.x. La autenticación de formularios de ASP.NET proporciona una manera cómoda de incorporar un formulario de inicio de sesión en la aplicación de ASP.NET y de validar a los usuarios en una base de datos u otro almacén de datos. Los miembros de la clase FormsAuthentication permiten controlar las cookies para la autenticación, comprobar si hay un inicio de sesión válido, cerrar la sesión de un usuario, etc. Pero la implementación de la autenticación de formularios en una aplicación de ASP.NET 1.x puede necesitar una cantidad de código importante.

La pertenencia a ASP.NET 2.0 es un avance importante sobre el uso de la autenticación de formularios. (La pertenencia es más sólida cuando se combina con la autenticación de formularios, pero el uso de la autenticación de formularios no es un requisito). Como verá más adelante, puede usar la Pertenencia de ASP.NET y los controles de inicio de sesión en ASP.NET 2.0 para implementar un sistema de pertenencia eficaz sin escribir mucho código.

Implementación de la pertenencia en ASP.NET 2.0

La pertenencia se implementa siguiendo cuatro pasos. Tenga en cuenta que hay muchos subprocesos implicados, así como una configuración opcional que también se puede implementar. Estos pasos están diseñados para ilustrar la visión general de la configuración de la pertenencia.

  1. Cree la base de datos de pertenencia (si se usa SQL Server como almacén de pertenencia).

  2. Especifique las opciones de pertenencia en los archivos de configuración de las aplicaciones. (La pertenencia está habilitada de manera predeterminada).

  3. Determine el tipo de almacén de pertenencia que quiere usar. Las opciones son:

    • Microsoft SQL Server (versión 7.0 o posterior)
    • Almacén de Active Directory
    • Proveedor de pertenencia personalizado
  4. Configure la aplicación para la autenticación de formularios de ASP.NET. Como antes, la pertenencia está diseñada para aprovechar la autenticación de formularios, pero el uso de la autenticación de formularios no es un requisito.

  5. Defina cuentas de usuario para pertenencia y configure roles si lo prefiere.

Creación de la base de datos de pertenencia

Si usa SQL Server 7.0 o posterior como almacén de pertenencia, puede usar la utilidad aspnet_regsql (disponible con más facilidad desde el símbolo del sistema de .NET 2005 en Visual Studio) para configurar la base de datos. La utilidad aspnet_regsql se puede usar como herramienta de símbolo del sistema o mediante un asistente de GUI. El asistente es la manera más fácil de configurar la base de datos. Para acceder al asistente, simplemente ejecute el siguiente comando:

aspnet_regsql W

Una vez que ejecute ese comando, se abrirá el Asistente para la instalación de SQL Server de ASP.NET como se muestra a continuación.

Screenshot that shows an A S P dot NET S Q L Server Setup Wizard.

Figura 1

El Asistente para la instalación de SQL Server de ASP.NET crea el sitio web en la instancia especificada en el asistente. Pero ASP.NET usará la cadena de conexión del archivo machine.config para conectarse a la base de datos. De manera predeterminada, esta cadena de conexión apuntará a una instancia de SQL Server 2005, por lo que si usa una instancia de SQL Server 2000 o SQL Server 7.0, tendrá que modificar la cadena de conexión en el archivo machine.config. Esta cadena de conexión se puede encontrar aquí:

<configuration>
    <connectionStrings>
      <add name="LocalSqlServer"
         connectionString="data source=(local);
         Integrated Security=SSPI;Initial Catalog=aspnetdb;"  
         providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>

Desafortunadamente, si no modifica la cadena de conexión, ASP.NET no mostrará un error descriptivo. Solo se quejará de que no ha creado la base de datos. En el caso anterior, se ha modificado la cadena de conexión para que apunte a la instancia local de SQL Server 2000.

Especificación de la configuración y adición de usuarios y roles

El siguiente paso para configurar la pertenencia consiste en agregar la información necesaria al archivo web.config de la aplicación. En ASP.NET 1.x, la modificación del archivo web.config a veces era difícil debido al uso de lowerCamelCase y la falta de IntelliSense. En Visual Studio .NET 2005 se facilita mucho la tarea con IntelliSense para los archivos de configuración, pero ASP.NET 2.0 va un paso más allá al proporcionar una interfaz web para editar los archivos de configuración.

Para iniciar la interfaz web, haga clic en el botón Configuración de ASP.NET de la barra de herramientas del Explorador de soluciones como se muestra a continuación. También puede iniciar la interfaz web mediante elementos emergentes que se muestran cuando se insertan controles de inicio de sesión.

Screenshot that shows a Solution Explorer toolbar with web.config selected.

Figura 2

Esto inicia la Herramienta Administración de sitios web de ASP.NET que se muestra a continuación. Administración de sitios web de ASP.NET es una interfaz de cuatro pestañas que facilita la administración de la configuración de la aplicación. Las siguientes pestañas están disponibles:

  • Inicio
  • Seguridad Configure usuarios, roles y acceso.
  • Aplicación Configuración de valores de la aplicación.
  • Proveedor Configure y pruebe el proveedor de pertenencia a aplicaciones.

La herramienta Administración de sitios web le permite crear fácilmente usuarios, crear roles y administrar usuarios y roles. Esta capacidad no está disponible en la interfaz de Windows. La interfaz de Windows permite definir fácilmente los valores de autorización y agregar, eliminar y administrar proveedores, funcionalidades que no están en la herramienta de Administración de sitios web.

Para iniciar la interfaz de Windows, abra el complemento Internet Information Services, haga clic con el botón derecho en la aplicación y elija Propiedades. Haga clic en la pestaña ASP.NET y después en el botón Editar configuración. (La aplicación se debe ejecutar en ASP.NET 2.0 para habilitar el botón Editar configuración. También puede configurar la versión de ASP.NET en el cuadro de diálogo ASP.NET). Se abre el cuadro de diálogo Configuración de ASP.NET, como se muestra a continuación.

Screenshot that shows a General tab on the A S P dot N E T Configuration Settings dialog.

Ilustración 3

En la pestaña General, se muestran las cadenas de conexión y valores de la aplicación. Los valores en cursiva se definen en un archivo de configuración primario (machine.config o web.config en un nivel superior) y los valores que no están en cursiva proceden del archivo de configuración de la aplicación. Si se agrega, quita o edita un valor en el nivel de aplicación, ASP.NET lo agregará, quitará o modificará en los niveles de aplicación de web.config en lugar de quitar el valor del archivo de configuración del que se hereda.

A continuación se muestra la pestaña Autenticación. Aquí es donde configurará los valores de pertenencia. Aquí se pueden configurar valores de autenticación de formularios, proveedores de pertenencia y proveedores de roles.

Screenshot that shows an Authentication tab on the A S P dot N E T Configurations dialog.

Ilustración 4

Implementación de la pertenencia en la aplicación

La manera más fácil de implementar la pertenencia de ASP.NET 2.0 en la aplicación consiste en usar los controles de inicio de sesión proporcionados. Este método le permite implementar los conceptos básicos de la pertenencia de ASP.NET 2.0 sin escribir código.

Los siguientes controles de inicio de sesión están disponibles en ASP.NET 2.0:

Control Login

El control Login proporciona una interfaz para que alguien inicie sesión en el sistema de pertenencia. Proporciona un cuadro de texto de nombre de usuario y contraseña, y un botón de inicio de sesión. Muchas otras características comunes, como un vínculo para el registro de usuarios que aún no lo han hecho, una casilla que permite al usuario iniciar sesión automáticamente en visitas posteriores, un vínculo para un recordatorio de contraseña, etc. Todas las características del control Login se pueden personalizar mediante las propiedades del control.

En ASP.NET 1.x, los desarrolladores tenían que escribir una cantidad de código importante para realizar una búsqueda al usar la autenticación de formularios. Con la pertenencia de ASP.NET 2.0, puede validar a los usuarios sin escribir código. ASP.NET realizará automáticamente la búsqueda del usuario. (Si usa el control Login sin la pertenencia de ASP.NET, puede utilizar el métodoOnAuthenticate para validar al usuario).

Control LoginView

El control LoginView es un control con plantilla que proporciona dos plantillas de forma predeterminada; AnonymousTemplate y LoggedInTemplate. La plantilla que se muestra viene determinada por si el usuario ha iniciado sesión en el sistema de pertenencia. Este control se usa normalmente para mostrar un control Login cuando un usuario aún no ha iniciado sesión y un control LoginStatus u otros controles de inicio de sesión cuando el usuario ha iniciado sesión. Si usa la administración de roles en la aplicación de ASP.NET, el control LoginView puede mostrar una plantilla específica basada en el rol de los usuarios. (Más adelante encontrará información adicional sobre la administración de roles en ASP.NET).

Control PasswordRecovery

El control PasswordRecovery permite a los usuarios recibir un correo electrónico con su contraseña actual o restablecer su contraseña. Se pueden recuperar y enviar por correo electrónico a los usuarios contraseñas en texto no cifrado y cifradas. Si la contraseña está cifrada con hash, no se puede recuperar. En su lugar, el usuario tendrá que realizar un restablecimiento de contraseña.

Control LoginStatus

El control LoginStatus se usa para mostrar un indicador de inicio de sesión a los usuarios que no han iniciado sesión y un indicador de cierre de sesión a los usuarios que han iniciado sesión actualmente. La propiedad Request.IsAuthenticated se usa para determinar qué indicador se va a mostrar. El indicador mostrado por el control LoginStatus puede ser texto (implementado mediante las propiedades LoginText y LogoutText) o imágenes (implementadas mediante las propiedades LoginImageUrl y LogoutImageUrl).

Cuando un usuario cierra sesión mediante el control LoginStatus, se le redirige a la dirección URL especificada por la propiedad LogoutPageUrl. Si esa propiedad no está establecida, se actualiza la página actual. Como es probable que el sitio esté protegido por la autenticación de formularios, la actualización de la página actual redirigirá al usuario a la página de inicio de sesión del sitio.

Control LoginName

El control LoginName muestra el nombre del usuario que ha iniciado sesión actualmente en el sitio.

Control CreateUserWizard

El control CreateUserWizard proporciona a los usuarios una manera cómoda de registrarse en el sistema de pertenencia. Puede agregar pasos (implementados como una colección de controles WizardStep) desde la interfaz que se muestra a continuación.

Screenshot that shows a Create User Wizard Tasks dialog with a drop down menu to Sign Up for Your New Account.

Ilustración 5

CreateUserWizard es un control con plantilla que se deriva de la clase Wizard y proporciona las siguientes plantillas:

  • HeaderTemplate Esta plantilla controla la apariencia del encabezado del asistente.
  • SidebarTemplate Esta plantilla controla la apariencia de la barra lateral del asistente.
  • StartNavigationTemplate Esta plantilla controla la apariencia del área de navegación del asistente en el paso inicial.
  • StepNavigationTemplate Esta plantilla controla la apariencia del área de navegación cuando no está en el paso de inicio o finalización.
  • FinishNavigationTemplate Esta plantilla controla la apariencia del área de navegación cuando está en el paso de finalización.

Además, para cada paso que agregue al Asistente, ASP.NET creará una plantilla personalizada que contiene instancias ContentTemplate y CustomNavigationTemplate para ese paso. Para obtener información completa sobre cómo personalizar CreateUserWizard, vea la documentación de VS.NET 2005:

Control ChangePassword

El control ChangePassword permite a los usuarios cambiar su contraseña. Si la propiedad DisplayUserName es true (es false de manera predeterminada) el usuario puede cambiar su contraseña cuando no haya iniciado sesión. Si el usuario ya ha iniciado sesión y la propiedad DisplayUserName es true, el usuario podrá cambiar la contraseña de otro usuario que no haya iniciado sesión, siempre que conozca su identificador de usuario.

Tenga en cuenta que si quiere que los usuarios puedan cambiar las contraseñas sin tener que iniciar sesión, deberá asegurarse de que la página en la que se muestra el control ChangePassword permite el acceso anónimo. Obviamente, los usuarios tendrán que proporcionar la contraseña antigua para cambiar su contraseña.

Administración de roles

La administración de roles permite asignar usuarios a un rol determinado y, después, restringir el acceso a determinados archivos o carpetas en función de ese rol. La administración de roles también proporciona una API para que pueda determinar mediante programación el rol de alguien o determinar todos los usuarios de un rol determinado y responder en consecuencia.

La administración de roles no es un requisito de la pertenencia de ASP.NET, ni la pertenencia es un requisito para usar la administración de roles. Pero los dos se complementan muy bien y es probable que los desarrolladores los usen de manera conjunta.

Para habilitar la administración de roles en la aplicación, realice el siguiente cambio en el archivo web.config:

<roleManager enabled="true" cacheRolesInCookie="true" cookieProtection="All" />

Cuando el atributo cacheRolesInCookie se establece en true, ASP.NET almacena en caché una pertenencia a roles de usuario en una cookie en el cliente. Esto permite que se produzcan búsquedas de roles sin llamadas a RoleProvider. Al usar este atributo, se recomienda a los desarrolladores asegurarse de que el atributo cookieProtection esté establecido en All. (Es el valor predeterminado). Esto garantiza que los datos de las cookies están cifrados y ayuda a garantizar que el contenido de las cookies no se haya modificado. Los roles se pueden agregar mediante la herramienta Administración de sitios web. Le permite definir fácilmente roles, configurar el acceso a partes del sitio en función de esos roles y asignar usuarios a roles.

Screenshot that shows an A S P dot N E T Web Site Administration Tool with the Add Role button.

Ilustración 6

Como se ha mostrado antes, para agregar roles nuevos solo hay que escribir el nombre del rol y, después, hacer clic en Agregar rol. Los roles existentes se pueden administrar o eliminar si hace clic en el vínculo adecuado en la lista de roles existentes.

Al administrar un rol, puede agregar o quitar usuarios como se muestra a continuación.

Screenshot that shows an A S P dot N E T Web Site Administration Tool with the Find User button.

Ilustración 7

Si activa la casilla Rol del usuario, puede agregar fácilmente un usuario a un rol específico. ASP.NET actualizará automáticamente la base de datos de pertenencia con las entradas adecuadas. También querrá configurar reglas de acceso para la aplicación. Los desarrolladores de ASP.NET 1.x están familiarizados con esto mediante el elemento <authorization> del archivo web.config y esa opción sigue disponible en ASP.NET 2.0. Pero es más fácil administrar las reglas de acceso mediante la herramienta Administración de sitios web, como se muestra a continuación.

Screenshot that shows the A S P dot N E T Web Site Administration tool with items selected under Users and Roles.

Figura 8

En este caso, la carpeta Administración está resaltada (es difícil de ver porque la herramienta la resalta en gris claro) y se ha concedido acceso al rol Administradores. Se ha denegado para todos los demás usuarios. Puede hacer clic en el icono principal para seleccionar una regla y, después, usar los botones Subir y Bajar para organizar las reglas. Como sucede con el elemento <authorization> de ASP.NET, las reglas se procesan en el orden en que aparecen. Es decir, si se invierte el orden de las reglas de la captura anterior, nadie tendría acceso a la carpeta Administración porque la primera regla que ASP.NET encontraría sería la que deniega a todos los usuarios el acceso a la carpeta.

ASP.NET 2.0 agrega un archivo web.config a la carpeta para la que va a especificar una regla de acceso. Las reglas de acceso se pueden editar desde el archivo de configuración o con la herramienta de Administración de sitios web. Es decir, la herramienta Administración de sitios web es simplemente una interfaz desde la que se puede editar el archivo de configuración en un entorno fácil de usar.

Uso de roles en código

La API para la administración de roles no ha cambiado desde la versión 1.x. El método IsInRole se usa para determinar si un usuario tiene un rol determinado.

if (User.IsInRole(Administrators)) {
    btnManageSite.Visible = true;
}

ASP.NET también crea una instancia de RolePrincipal como miembro del contexto actual. El objeto RolePrincipal se puede usar para obtener todos los roles a los que pertenece el usuario de la siguiente manera:

string[] userRoles = ((RolePrincipal)User).GetRoles();

Uso de RoleGroups con el control LoginView

Ahora que comprende la administración y la pertenencia a roles, se describirá brevemente cómo el control LoginView aprovecha esta funcionalidad en ASP.NET 2.0. Como se ha mencionado antes, el control LoginView es un control con plantilla que proporciona dos plantillas de manera predeterminada; AnonymousTemplate y LoggedInTemplate. Dentro del cuadro de diálogo Tareas de LoginView hay un vínculo (que se muestra a continuación) que permite editar instancias de RoleGroup.

Screenshot that shows the Login View control within the Login View Tasks dialog with a drop down and Role Group selected.

Figura 9

Cada objeto RoleGroup contiene una matriz de cadenas que define a qué roles se aplica ese objeto RoleGroup. Para agregar un nuevo objeto RoleGroup al control LoginView, haga clic en el vínculo Editar RoleGroups. En la imagen anterior, puede ver que se ha agregado un nuevo objeto RoleGroup para Administradores. Al seleccionar ese objeto RoleGroup (RoleGroup[0]) en la lista desplegable Vistas, se puede configurar una plantilla que solo se mostrará a los miembros del rol Administradores. En la imagen siguiente, se agrega un nuevo objeto RoleGroup que se aplica a los miembros de los roles Sales y Distribution. Esto agrega un segundo objeto RoleGroup a la lista desplegable Vistas en el cuadro de diálogo Tareas de LoginView y cualquier elemento agregado a esa plantilla será visible por cualquier usuario con el rol Sales o Distribution.

Screenshot that shows a Role Group Collection Editor dialog with a dropdown selecting Administrators.

Figura 10

Invalidación del proveedor de pertenencia existente

Hay un par de maneras de ampliar la funcionalidad de la pertenencia de ASP.NET. En primer lugar, puede cambiar obviamente la funcionalidad existente de la clase SqlMembershipProvider si hereda de ella e invalida sus métodos. Por ejemplo, si quiere implementar funcionalidad propia al crear usuarios, puede crear una clase propia que herede de SqlMembershipProvider de la siguiente manera:

public class jForumMembershipProvider : SqlMembershipProvider {
    public jForumMembershipProvider() {

    }
    public override MembershipUser CreateUser(
    string username,
    string password,
    string email,
    string passwordQuestion,
    string passwordAnswer,
    bool isApproved,
    object providerUserKey,
    out MembershipCreateStatus status) {
        // your own implementation
        return base.CreateUser(
        username,
        password,
        email,
        passwordQuestion,
        passwordAnswer,
        isApproved,
        providerUserKey,
        out status);
    }
}

Si, por otro lado, quiere crear un proveedor propio (para almacenar la información de pertenencia en una base de datos de Access, por ejemplo) puede hacerlo.

Creación de un proveedor de pertenencia propio

Para crear un proveedor de pertenencia propio, primero deberá crear una clase que herede de la clase MembershipProvider. Si usa VB.NET, Visual Studio 2005 agregará los códigos auxiliares para todos los métodos que necesita invalidar. Si usa C#, tendrá que agregar los códigos auxiliares.

Tendrá que invalidar lo siguiente:

  • ApplicationName (propiedad)
  • ChangePassword (función)
  • ChangePasswordQuestionAndAnswer (función)
  • CreateUser (función)
  • DeleteUser (función)
  • EnablePasswordReset (propiedad)
  • EnablePasswordRetrieval (propiedad)
  • FindUsersByEmail (función)
  • FindUsersByName (función)
  • GetAllUsers (función)
  • GetNumberOfUsersOnline (función)
  • GetPassword (función)
  • GetUser (función)
  • GetUserNameByEmail (función)
  • MaxInvalidPasswordAttempts (propiedad)
  • MinRequiredNonAlphanumericCharacters (propiedad)
  • MinRequiredPasswordLength (propiedad)
  • PasswordAttemptWindow (propiedad)
  • PasswordFormat (propiedad)
  • PasswordStrengthRegularExpression (propiedad)
  • RequiresQuestionAndAnswer (propiedad)
  • RequiresUniqueEmail (propiedad)
  • ResetPassword (función)
  • UnlockUser (función)
  • UpdateUser (función)
  • ValidateUser (función)

Es una lista bastante amplia para implementar como desarrollador de C#. Es posible que le resulte más fácil crear la clase en VB.NET sin ninguna implementación y, después, usar .NET Reflector o una herramienta similar para convertir el código en C#.

La cadena de conexión y otras propiedades se deben establecer en sus valores predeterminados en el método Initialize. (El método Initialize se desencadena cuando el proveedor se carga en tiempo de ejecución). El segundo parámetro para el método Initialize es de tipo System.Collections.Specialized.NameValueCollection y es una referencia al elemento <add> asociado al proveedor personalizado en el archivo web.config. Esa entrada es similar a la siguiente:

<system.web>
  <authentication mode="Forms"/>
  <membership
  defaultProvider="jForumCustomMembershipProvider" >
    <providers>
      <add name="jForumCustomMembershipProvider"
      type="jForumCustomMembershipProvider"
      requiresQuestionAndAnswer="true"
      connectionString="Provider=Microsoft.Jet.
        OLEDB.4.0;Data Source=C:\jForumCustomMembershipProvider\
        App_Data\Members.mdb;Persist Security
        Info=False"
        />
    </providers>
  </membership>
</system.web>

Este es un ejemplo del método Initialize.

public override void Initialize(string name,
    System.Collections.Specialized.NameValueCollection config) {

    if (config["requiresQuestionAndAnswer"])
        _requiresQuestionAndAnswer = true;
    _connString = config["connectionString"];
    base.Initialize(name, config);
}

Para validar al usuario cuando envíe el formulario de inicio de sesión, deberá usar el método ValidateUser. Este método se desencadena cuando el usuario hace clic en el botón de inicio de sesión del control Login. Colocará el código que realiza la búsqueda del usuario en este método.

Como puede ver, escribir un proveedor de pertenencia propio no es difícil y le permite ampliar esta eficaz funcionalidad de ASP.NET 2.0.