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” />

10 thoughts on “Creando usuarios programaticamente con Membership y Profiles de ASP.NET 2.0

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

  2. 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.

  3. 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.

  4. Esta bien el post, una pregunta, como obtengo un dataset de los usuarios filtrados por alguna información almacenada en el profile, por ejemplo: si tengo un dato adicional “direccionLaboral” como dato adicional en el profile, como puedo seleccionar “todos los usuarios que vivan en “dirección laboral” ??? desde ya muchas gracias.

  5. Lo que puedes hacer es un SiteMap de ASP.NET que describa la jerarquia de tus menus, posteriormente en el XML de este archive tu puedes definer que Roles de ASP.NET son los que tienen el permiso de ver cada pagina. suerte!

Leave a Reply

Your email address will not be published. Required fields are marked *