Asociar tabla a aspnet_users

A pesar de no tener ninguna complicación especial, son muchos los programadores que utilizan enlaces no naturales para vincular tablas con el sistema de usuarios de ASP.NET.  En la jerarquía de tablas instalada, la tabla de usuarios ASPNET_Users tiene como clave primaria la columna UserId y esa será la columna que debamos de utilizar para enlazar con el resto de tablas.

El problema es que esta columna es un GUID, característica que hace que nos pueda parecer poco idónea para utilizarla como clave foránea. Las alternativas que tenemos como claves candidatas en la tabla de usuarios es la combinación de ‘LoweredUserName’ y ‘ApplicationId’. Aún en el caso de que ignoremos ‘ApplicationId’ por utilizar la base de datos para una única aplicación, el campo LoweredUserName es de tipo varchar(256), mucho mayor que un GUID y desde luego mucho menos adecuado para utilizar como clave externa.

Veamos un ejemplo básico de como se personaliza un control CreateUserWizard para añadir información personalizada en una tabla viculada con la estructura de Membership.

1.- Diseño de la tabla: la clave primaria coincide con el campo UserId de ASPNET_Users. En este sencillo ejemplo vamos a guardar el nombre, apellido y fecha de nacimiento.

2.- Añadimos un paso más al control para solicitar la información adicional:

 3.- Controlamos la navegación en el primer paso del Wizard, que sigue siendo el paso de creación del usuario:

4.- Guardamos la información adicional al finalizar el asistente. Evidentemente podemos utilizar cualquier tecnología de acceso a datos aunque para mayor claridad haya escogido la más básica.

 Fíjate que este código es independiente del proveedor del Membership Provider que utilicemos, ya que la propiedad ProviderUserKey devuelve un objeto con la clave primaria del proveedor. En nuestro caso esta clave primaria es el UserId de tipo Guid, para otros proveedores puede ser cualquier otra cosa.