Creando usuarios programaticamente con Membership y Profiles de ASP.NET 2.0

Desde hace tiempo he querido escribir sobre una técnica ASP.NET 2.0 que me parece interesante compartir. Se trata de utilizar de manera combinada la funcionalidad de las clases Membership y Profiles para establecer toda la maquinaria de administración y almacenamiento de usuarios. Sabemos que ASP.NET 2.0 nos ofrece estas piezas de infraestructura para la construcción de soluciones web con la finalidad de agilizar la creación y manejo eficiente de usuarios, roles y perfiles, claro entre otras posibilidades.

Lo que veremos en este post es una técnica que nos permite manipular usuarios con la clase Membership haciendo uso de los controles Login y que además podamos relacionar y extender los datos que requerimos asociar a un usuario a través del uso de la funcionalidad de Profiles para que de manera conjunta extendamos esta funcionalidad a nuestro beneficio.

En muchas ocasiones cuando habilitamos Membership para el control y manejo de usuarios es común que nos quedemos cortos con los datos de usuario que queremos almacenar y que son relevantes e incluso requeridos para la aplicación que estamos construyendo. La clase Membership es una clase que cuenta con métodos estáticos para crear nuevos, eliminar existentes, cambiar contraseñas y validar la existencia de usuarios. Esta clase funciona con un modelo basado en proveedor el cual nos permite hacer que trabaje independientemente del origen de datos donde se encuentra la información.

En la mayoría de los escenarios de una aplicación multi usuario normalmente requerimos proporcionar mucho más información que puede ser de utilidad para la aplicación que estamos escribiendo. Por ejemplo:

  • El nombre completo del usuario
  • A que departamento pertenece
  • Que teléfono y extensión tiene
  • Incluso información de configuración visual o personalización

Seguro encontraras mucha mas información que ocupes asociar al contexto de un usuario.
Sin embargo Membership por su naturaleza se queda corto por decirlo así con la cantidad de datos que almacena y en definitiva necesitamos asociar más información. Aquí es donde entra el uso de Profiles o en otras palabras perfiles de usuario. Profiles en ASP.NET 2.0 es un mecanismo que permite almacenar de manera persistente información adicional para cada usuario registrados en nuestro sitio. Tambien funiona bajo un modelo de tipo proveedor. Si deseas conocer mas sobre Profiles entra a este link. Por un lado tenemos Membership para la administración de usuarios y Profiles para la extensión de la información de un usuario en específico.

Los pasos para habilitar esta funcionalidades son:

  1. Configurar una base de datos para el almacenamiento persistente de usuarios, roles y perfiles
  2. Configurar en el archivo web.config nuestra aplicación web para utilizar dicha base de datos de almacenamiento y crear algunos usuarios
  3. Configurar en el archivo web.config el uso de perfiles y su estructura de información
  4. Escribir código para obtener de nuestro almacenamiento persistente la información de un usuario y su perfil

Obtener los usuarios de un sitio programáticamente
MEM01.jpg

Como vemos, tenemos un control GridView que muestra cierta información de los usuarios registrados en este sitio. Gracias al uso de la clase Membership es que de manera programática podemos obtener esta información. El código es el siguiente:

private void LoadData()
    {
        this.GridView1.DataSource = Membership.GetAllUsers();
        this.GridView1.DataBind();
    }

Insertar usuarios en un sitio programaticamente

MEM02.jpg

Para realizar el proceso de creación de usuarios utilizamos el control CrateUserWizard el cual se comporta conforme se especifique en el archivo de configuración web.config, por ejemplo, utiliza una expresión regular especificada en dicho archivo para validar el contenido del texto capturado en el campo contraseña. A su vez, este control utiliza la clase MemberShip y el método CreateUsers para insertar nuevos usuarios.

Una vez que proporcionamos la información y damos clic sobre “Crear Usuario” el control muestra una pantalla de confirmación de la operación.


MEM03.jpg

Hasta el momento esto es solamente funcionalidad “Out of The Box” de ASP.NET 2.0. Sin embargo como pudimos ver, requerimos mas información para describir a un usuario. Podemos realizar este proceso de manera programática simplemente diseñando nuestro formulario web de captura y ejecutando el siguiente código:

Membership.CreateUser(this.usernameTextBox.Text, this.passwordTextBox.Text, this.emailTextBox.Text);

Editando perfiles de usuario programáticamente

MEM05.jpg

Como vemos una vez que tenemos a nuestro usuario creado, es el momento de asociarle información adicional y almacenarla a través de perfiles de ASP.NET 2.0. En este caso, al usuario “hgonzalez” le asignamos información adicional como su nombre completo, una descripción e información relevante a esta aplicación. Adicionalmente podemos asociarle los roles que este usuario tiene asignados. Esta funcionalidad está ligada a Roles de ASP.NET 2.0. Veamos el código de cómo actualizamos el perfil de un usuario previamente creado.

MembershipUser user = Membership.GetUser(“hgonzalez”);

ProfileCommon prof = Profile.GetProfile(user.UserName);

user.Email = emailTextBox.Text;

prof.UsersData.FirstName = this.firstNameTextBox.Text;

prof.UsersData.LastName = this.lastNameTextBox.Text;

prof.UsersData.Comments = commentTextBox.Text;

prof.UsersData.IsAuthor = chkAuthor.Checked;

prof.UsersData.WithNotifications = chkNotifications.Checked;

prof.UsersData.CountryID = Convert.ToInt32(countryDropDown.SelectedValue);

prof.UsersData.CountryName = countryDropDown.SelectedItem.Text;

prof.Save();

Membership.UpdateUser(user);

                    // Actualiza los roles asignados
                    foreach (ListItem item in cblRoles.Items)
                    {
                        if (item.Selected)
                        {
                            if (!Roles.IsUserInRole(GetStringID(), item.Text))
                                Roles.AddUserToRole(GetStringID(), item.Text);
                        }
                        else
                        {
                            if(Roles.IsUserInRole(GetStringID(), item.Text))
                                Roles.RemoveUserFromRole(GetStringID(), item.Text);
                        }
                    }

Si vez el codigo encontraras que tenemos un concepto un poco distinto al que utilizamos en Profiles. El motivo es porque en vez de declarar las propiedades de mi profile en el archivo web.config, simplemente especifico que quiero utilizar una clase como mi estructura de informacion para el manejo de perfiles. Esta tecnica nos da interesantes capacidades.

<profile>

      <properties>

        <add name="UsersData" type="MyAssembly.BLL.UserTable" serializeAs="Binary" />

      </properties>

  </profile>

De esta manera me aseguro de tener Profiles con la informacion de usuario que me interesa manejar dentro de mi aplicacion. Lo interesante es que si por alguna razon existe algun otro cambio en la estructura simplemente modifico la definicion de mi clase y con eso es suficiente para ver disponible y reflejado en todo mi sitio ese nuevo valor.

En el caso de Membership aqui dejo la configuracion, muy basica por cierto.

<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="false" applicationName="/" requiresUniqueEmail="true" minRequiredPasswordLength="1" minRequiredNonalphanumericCharacters="0" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" passwordAttemptWindow="10" passwordStrengthRegularExpression="" />

      </providers>

    </membership>

Y claro hay que habilitar el uso de roles y estos se configuran de la siguiente manera:

<roleManager enabled="true" />

Published Saturday, September 02, 2006 2:23 PM by haaron
Filed under: , ,

Comments

Friday, November 03, 2006 11:01 AM by kio

# re: Creando usuarios programaticamente con Membership y Profiles de ASP.NET 2.0

tendras una demo de eso, justo tengo problemas con esto de aumentar datos adicionales Gracias Anticipadas n_n kiosonakay@hotmail.com
Monday, December 04, 2006 12:25 PM by Carlos Merchan

# re: Creando usuarios programaticamente con Membership y Profiles de ASP.NET 2.0

que me recomiendas si quiero hacer un administrador de usuarios y roles para multiples aplicaciones utilizando un solo web site.

Monday, July 09, 2007 5:24 PM by Luis Fernando

# re: Creando usuarios programaticamente con Membership y Profiles de ASP.NET 2.0

Algun codigo de ejemplo para visualizar y comprender mas rapido como funciona ? por si acaso fhernando0207@hotmail.com

Tuesday, December 25, 2007 1:50 AM by sandra

# re: Creando usuarios programaticamente con Membership y Profiles de ASP.NET 2.0

Hola mi nombre es Sandra(sandrazka@hotmail.com)

Esta interesante el tema hace tiempo queria saber como hacer esto.

Pero disculpenme que me salga del tema pero es q tengo una gran inquietud y es sobre:

como utilizar esto de los proveedores de memberschip, roles y profiles si estoy usando otra bd(oracle, postre o enterprisedb por ejemplo. He buscado info. pero solo he visto sobre sqlserver.

Tuesday, January 08, 2008 5:07 PM by Alexander Clen

# re: Creando usuarios programaticamente con Membership y Profiles de ASP.NET 2.0

Muy interesante el tema, justamente es lo que deseo applicar en un nuevo proyecto que he empezado, pero si pudiera dar algunas pautas mas.

Tuesday, January 08, 2008 6:19 PM by haaron

# re: Creando usuarios programaticamente con Membership y Profiles de ASP.NET 2.0

Oye pues que bien, estoy seguro no te vas a arrepentir de utilizar MemberShip como tu mecanismo de administracion de credenciales para tu proyecto. Tu comenta tu duda especifica y con gusto te respondere.

Monday, August 04, 2008 11:36 AM by Cristian Correa

# re: Creando usuarios programaticamente con Membership y Profiles de ASP.NET 2.0

Hola que tal, tienes una demo de este ejemplo?. Si me lo enviaras te lo agradecería mucho. Mi correo es skauch@gmail.com

Saludos cordiales

Leave a Comment

(required) 
(required) 
(optional)
(required)