ASP.NET Membership: Cómo guardar datos adicionales de los usuarios

En los  últimos posts he estado hablando sobre la seguridad de ASP.NET basada en Forms. Esto ha traído algunas preguntas por parte de los visitantes. Una de ellas, bastante común, es la de cómo almacenar información adicional atada a los usuarios que hemos autenticado.

La API de Membership que viene con ASP.NET, y en concreto el proveedor de Membership para trabajo contra SQL Server (SqlMembershipProvider) nos provee de los medios suficientes para almacenar la información básica sobre los usuarios, esto es, el nombre, su login y su clave, que es lo mínimo necesario para trabajar. En este gráfico puedes ver la estructura completa creada por ASP.NET (más bien por aspnet_regsql.exe) en nuestra base de datos para dar soporte a SqlMembershipProvider y relacionados.

Obviamente casi siempre necesitaremos almacenar mucha más información sobre ellos, relacionándola de manera directa y sencilla para poder extraerla. Así, por ejemplo, podemos necesitar almacenar sus datos de contacto, infromación sobre documentos que genere,  estadísticas de aceso, y mil informaciones más.

Lo que haríamos normalmente en cualquier aplicación creada íntegramente por nosotros, es crear una(s) nueva(s) tabla(s) para almacenar esta información adicional sobre el usuario, y relacionarla creando claves externas en la base de datos, usando el identificador único del usuario para ello. Y con Membership exactamente lo mismo. Podemos crear tablas extra y relacionarlas con la tabla aspnet_Users mediante la clave primaria de ésta, UserId.

Nota: El nombre de usuario, campo LoweredUserName) es también único para cada aplicación (es decir combinado con el campo  ApplicationId), pero es mejor utilizar la clave primaria de la tabla.

La única pega es que, posteriormente, a la hora de hacer consultas y extraer los datos necesitaremos saber este Id único para poder filtrar. ¿Y eso como lo hago?

Muy sencillo. La clase MembershipUser dispone de una propiedad llamada ProviderUserKey que proporciona precisamente ese valor único para cada proveedor. En el caso del proveedor para SQL proporciona el valor del campo UserId que hemos visto. Para el del usuario actualmente autenticado sería, en VB, así:

        Dim usuario As MembershipUser = Membership.GetUser
        Dim usuarioID As String = usuario.ProviderUserKey.ToString

Para un nombre de usuario cualquiera, aunque no esté autenticado, sería:

        Dim usuario As MembershipUser = Membership.GetUser("usuario")
Dim usuarioID As String = usuario.ProviderUserKey.ToString

OJO: hay que tener en cuenta que con el SqlMembershipProvider este UserId es un GUID, por eso lo transformamos en una cadena (aunque se podría transformar directamente en una clase Guid). En el caso de otros proveedores podría ser cualquier otra cosa, por ejemplo, un entero.

Con esto no tienes problma de relacionar cualquier información extra en la BD con los usuarios de ASP.NET.

Sencillo, pero mucha gente lo desconoce. Espero que te sea útil 🙂

Sin categoría

4 thoughts on “ASP.NET Membership: Cómo guardar datos adicionales de los usuarios

  1. Justo acabo de ideármelas para obtener esto con unos cuantos quebraderos de cabeza y malabares. Un poco tarde para mí, pero muy buena la info, gracias, la utilizaré.

  2. wow! intesante!… pero me salio una duda… se podrá personalizar el nombre de usuario a solo numeros? en lugar de hgonzales por ejemplo 501223384 o algo asi?…

    estaria perfecto eso, pero no encuentro nada relacionado!…

    Saludos!

Responder a anonymous Cancelar respuesta

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