En el post anterior publiqué la teoría sobre los proveedores de autenticación, autorización y personalización. Y hoy toca algo práctico, para ello personalizaremos los proveedores predeterminados, aprenderemos a usar los controles «inicio de sesión» y usaremos la API que ASP.NET nos provee.
¿Dónde y cómo se configuran los proveedores?
Existen diferentes formas de uso de un proveedor, las opciones son las siguientes:
- Uso del proveedor por defecto
- Configurar el proveedor por defecto
- Crear nuestro propio proveedor heredando de su clase base
ASP.NET crea su propia base de datos, se trata de la base de datos ASPNETDB.MDF, dentro de la carpeta de ASP.NET App_Data. Puede ver las tablas de esta base de datos en la siguiente figura. Por defecto usa el enlace dinámico de SQL Express. Podríamos copiar las tablas y procedimientos almacenados de la base de datos de ASP.NET y simplemente cambiarle la cadena de conexión para que se dirija a nuestra
En nuestro ejemplo configuraremos el proveedor por defecto, está configuración se debe hacer en el archivo Web.Config, siga los siguientes pasos:
1. Establezca el modo de autenticación como Forms, para ello introduzca en el nodo System.Web el siguiente fuente:
<authentication mode="Forms" />
De forma predeterminada la página donde el usuario debe ingresar las credenciales es Login.aspx, para cambiar eso debemos ampliar el nodo autentication como se muestra en el siguiente fuente:
<authentication mode="Forms">
<forms loginUrl="IngresarCredenciales.aspx" defaultUrl="Inicio.aspx" />
</authentication>
2. Para configurar el MemberShip debemos eliminar el proveedor por defecto y luego añadir el nuestro configurado para ello introduzca en System.Web el siguiente fuente:
<membership>
<providers>
<remove name="AspNetSqlMemberShipProvider"/>
<add name="AspNetSqlMemberShipProvider"
type="System.Web.Security.SqlMemberShipProvider, System.Web, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/Proveedores"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="6"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
passwordStrengthRegularExpression="" />
</providers>
</membership>
3. Para configurar RoleProvider agregue el siguiente fuente en el nodo System.Web:
<roleManager>
<providers>
<remove name="AspNetSqlRoleProvider"/>
<add name="AspNetSqlRoleProvider"
type="System.Web.Securty.RoleProvider, System.Web, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
ApplicationName="/Proveedores" />
</providers>
</roleManager>
4. Para configurar el Profile agregue el siguiente fuente.
<profile>
<providers>
<remove name="AspNetSqlProfileProvider"/>
<add name="AspNetProfileProvider"
type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
ApplicationName="/Proveedores" />
</providers>
</profile>
Es muy importante que establezcan un nombre de aplicación ya que de caso contrario puede generar problemas a la hora de la implementación del sitio.
Para establecer las propiedades del profile debe añadir un código análogo al siguiente fuente en el nodo profile que acaba de añadir.
<properties>
<add name="NombreDeLaPropiedadString" type="System.String" />
<add name="NombreDeLaPorpiedadInteger" type="System.Int32"/>
</properties>
Controles “Inicio de sesión”
Los controles “inicio de sesión” son aquellos que usan la API de los proveedores en el Visual Studio los puede encontrar en el grupo Inicio de sesión como se muestra en la siguiente figura:
Los más importantes son:
Login: Con este control puede identificar a un usuario. Después de identificarse usará el parámetro ReturnUrl para devolver al usuario a la página donde estaba navegado. Su aspecto se muestra en la siguiente figura:
LoginView: Contiene diferentes vistas, para usuarios anónimos, identificados y para diferentes roles. Su aspecto lo podemos ver en la siguiente figura:
Como se muestra en la siguiente figura desde el panel de tareas comunes puede seleccionar cada vista. Este control permite una sencilla personalización del sitio dependiendo del rol que tenga el usuario.
LoginStatus: Se trata de un LinkButton, cuando el usuario no ha iniciado sesión permite ir a la página de acceso para poder iniciar sesión y en caso haber iniciado sesión nos permite cerrarla. Su aspecto lo muestra en la siguiente figura:
LoginName: Si el usuario ha iniciado sesión se muestra una cadena donde se sustituye la cadena {0} por el nombre de usuario. El que hemos usado para el ejemplo lo puede ver en la siguiente figura:
El resto de controles (PasswordRecovery, CreateUserWizard y ChangePassword) sirve para la gestión de las credenciales del usuario, recuperar la contraseña crear un usuario y cambiar la contraseña respectivamente.
Usando la API, MemberShip, Profile y Roles
Los controles antes citados, usan internamente la API de ASP.NET, se trata de tres clases que gracias a sus métodos compartidos puede gestionar con código los recursos y la personalización de nuestro sitio.
La case MemberShip, además de permitirle crear, eliminar y actualizar a los usuarios, le permite también consultarlos obteniéndolos con diferentes métodos, ya sea obteniendo una colección con todos los usuarios, obteniéndolo por el email o simplemente con el nombre de usuario.
Entre sus métodos los más interesantes son:
- Membership.GeneratePassword([Número de caracteres], [Número de caracteres no numéricos]): Genera una contraseña, de hasta 128 caracteres, aleatoria.
- Membership.GetNumberOfUsersOnline(): Devuelve el número de usuarios que han iniciado sesión que hay en ese momento.
El resto o son para obtener usuarios, validarlos o gestionarlos.
La clase Roles nos permite crear, eliminar, eliminar y obtener o agregar usuarios a un rol, además de los métodos para crear, eliminar roles y obtener o agregar usuarios a un rol, no tiene ningún método interesante.
Por último la clase Profile nos permite establecer y obtener las propiedades del usuario actual, además, nos permite, con el método GetProfile(), obtener el profile de otro usuario.
Puede obtener o establecer una propiedad como se muestra en el siguiente fuente (las propiedades son las establecidas en el Web.Config anteriormente).
Profile.NombreDeLaPropiedadString = "StringValue"
Profile.NombreDeLaPorpiedadInteger = 5
Profile.Save()
Además con la clase Profile puede obtener el Profile de otro usuario como puede ver en el siguiente fuente:
Profile.GetProfile("Usuario").NombreDeLaPropiedadString = "StringValue"
Profile.GetProfile("Usuario").NombreDeLaPorpiedadInteger = 5
Profile.Save()
Conclusión:
A pesar de que en el post anterior os dije que este trataría de la configuración de los proveedores y de los controles, he añadido la API debido a que en el próximo post quiero poner completo lo referente a la aplicacion de ASP.NET y si incluyese la API quedaría un post demasiado extenso, así que lo incluí en este.
El próximo tratará la configuración de la aplicación de ASP.NET y el uso para permitir el acceso a los usuarios o roles, dejando para un último mini-post la personalización con temas y el profile.