Personalizando las aplicaciones Web (II)

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.

8 thoughts on “Personalizando las aplicaciones Web (II)

  1. Buenas,

    estoy haciendo una aplicacion web y quiero meterle el control de usuarios. Debido a que las empresas de hosting te limitan fuertemente el numero de BBDD que tienes, me gustaria saber cómo incluir el contenido de esa base de datos en la que uso en mi aplicacion, para no tener que usar 2 BBDD. Basta con copiar las tablas y proc almacenados? Como apunto a esa base de datos (en el webconfig no aparece nada que apunte a aspnetdb.mdf)

    Muchas gracias por cualquier ayuda!!!!

  2. Buenas Oscar,

    Eso es relativamente sencillo.

    Una vez que copias todo el contenido de esa base de datos (puedes, con SQL Management Studio, crear los scripts para crear las tablas y procedimientos) en tu base de datos toca modificar el Web.Config.

    Por defecto (cuando está en blanco) tenemos algo así:


    Como puedes ver usa por defecto la cadena de conexión LocalSqlServer tienes dos opciones:

    1- Modificar ese código para poner la cadena de conexión de tu aplicación. Para hacer eso cambias el atributo connectionStringName al nombre de tu conexión.

    2- Cambiarle el nombre a tu cadena de conexión a LocalSqlServer yo creo que eso es mejor ya que así no tienes que modificar todo eso del Web.Config. Para hacer esto añades una nueva cadena de conexión como esta:

    Esa es la que tiene por defecto, solo tendrías que cambiar el atributo connectionString a la cadena de conexión de tu base de datos.

    Espero que te haya sido de ayuda, y cualquier otra duda, aquí estamos.

    Un saludo

  3. hola…

    necesito agregar 4 campos mas en la base de datos en la tabla de aspent_Roles para un requerimiento de un proyecto final de la universidad.

    lo que queria es si puedo modificar la clase de roles para enviarle esos cuatro 4 de mas y que se guarden y modifiquen.. tengo que modificar los store procedure o no se…

    si me entiendes y puedes ayudarme a tener un mejor panorama hacerca de lo que quiero llegar hacer..

    por favor escribeme al correo jgatjens@gmail.com

  4. hola que tal le escribo para preguntarle como puedo agregar un campo a la tabla de membership para que al introducir el valor de ese campo desde mi aplicaion en un create user wizard se pueda recopilar ese dato y almacenarse en la tabla de membership le agradeceria mucho su ayuda gracias de antemano

  5. y si tengo una base de datos ya cargada con valores y las contraseñas que ya poseen valores no alphanumericos, pero deseo que las nuevas contraseñas no requieran este tipo de valor para ser permitidas, como puedo recuperar las contraseñas antiguas y permitir que las nuevas no requieran valores no alphanumericos, estoy programando en vb 2008 y sql express 2005

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *