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 :-)

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA