¿Debo usar el nombre de usuario o la identificación del usuario para hacer referencia a usuarios autenticados en ASP.NET?

StackOverflow https://stackoverflow.com/questions/4911

  •  08-06-2019
  •  | 
  •  

Pregunta

Entonces, en mi sencillo sitio web de aprendizaje, utilizo el sistema de autenticación ASP.NET integrado.

Ahora estoy agregando una tabla de usuarios para guardar cosas como su zip, fecha de nacimiento, etc.Mi pregunta es:

  1. En la nueva tabla, la clave debe ser el nombre de usuario (la cadena) o el ID de usuario, que es el número de apariencia GUID que usan en el asp_ tables.
  2. Si la mejor práctica es utilizar esa fea guía, ¿alguien sabe cómo conseguirla?parece no ser accesible tan fácilmente como el nombre (System.Web.HttpContext.Current.User.Identity.Name)
  3. Si sugiere que no use ninguno de los dos (ni el guid ni los campos de nombre de usuario proporcionados por la autenticación ASP.NET), ¿cómo lo hago con la autenticación ASP.NET?Una opción que me gusta es utilizar la dirección de correo electrónico del usuario como inicio de sesión, pero ¿cómo puedo hacer que el sistema de autenticación ASP.NET utilice una dirección de correo electrónico en lugar de un nombre de usuario?(¿O no hay nada que hacer allí, solo soy yo quien decide que "sé" que el nombre de usuario es en realidad una dirección de correo electrónico?

Tenga en cuenta:

  • No estoy preguntando cómo obtener un GUID en .NET, solo me refiero a la columna ID de usuario en el asp_ tables como guía.
  • El nombre de usuario es único en la autenticación ASP.NET.
¿Fue útil?

Solución

Sugeriría usar el nombre de usuario como clave principal en la tabla si el nombre de usuario va a ser único; existen algunas buenas razones para hacerlo:

  1. La clave principal será un índice agrupado y, por lo tanto, la búsqueda de detalles de un usuario a través de su nombre de usuario será muy rápida.
  2. Evitará que aparezcan nombres de usuario duplicados
  3. No tiene que preocuparse por utilizar dos datos diferentes (nombre de usuario o guid)
  4. Hará que escribir código sea mucho más fácil al no tener que buscar dos bits de información.

Otros consejos

Debe utilizar alguna identificación única, ya sea el GUID que menciona o alguna otra clave generada automáticamente.Sin embargo, este número nunca debería ser visible para el usuario.

Una gran ventaja de esto es que todo el código puede funcionar con el ID de usuario, pero el nombre del usuario no está realmente vinculado a él.Luego, el usuario puede cambiar su nombre (lo cual me ha resultado útil en los sitios).Esto es especialmente útil si utiliza la dirección de correo electrónico como inicio de sesión del usuario...lo cual es muy conveniente para los usuarios (entonces no tienen que recordar 20 ID en caso de que su ID de usuario común sea popular).

Deberías utilizar el ID de usuario.Es la propiedad ProviderUserKey de MembershipUser.

Guid UserID = new Guid(Membership.GetUser(User.Identity.Name).ProviderUserKey.ToString());

Yo usaría una identificación de usuario.Si desea utilizar un nombre de usuario, la función "cambiar el nombre de usuario" será muy costosa.

Estoy de acuerdo con Palmsey, aunque parece haber un pequeño error en su código:

Guid UserID = new Guid(Membership.GetUser(User.Identity.Name)).ProviderUserKey.ToString());

debiera ser

Guid UserID = new Guid(Membership.GetUser(User.Identity.Name).ProviderUserKey.ToString());

Yo diría que use el ID de usuario para que los nombres de usuario aún se puedan cambiar sin afectar la clave principal.También configuraría la columna de nombre de usuario para que sea única para evitar nombres de usuario duplicados.

Si buscará principalmente por nombre de usuario en lugar de ID de usuario, haga que el nombre de usuario sea un índice agrupado y configure la clave principal para que no esté agrupada.Esto le brindará el acceso más rápido cuando busque nombres de usuario; sin embargo, si buscará principalmente ID de usuario, déjelo como índice agrupado.

Editar :Esto también encajará mejor con las tablas de membresía actuales de ASP.Net, ya que también utilizan el ID de usuario como clave principal.

Esto es antiguo, pero solo quiero que las personas que encuentren esto tengan en cuenta algunas cosas:

  1. La base de datos de miembros de aspnet ESTÁ optimizada cuando se trata de acceder a registros de usuarios.La búsqueda de índice agrupado (óptima) en SQL Server se utiliza cuando se busca un registro utilizando el nombre de usuario reducido y el ID de aplicación.Esto tiene mucho sentido ya que solo tenemos el nombre de usuario proporcionado para continuar cuando el usuario envía sus credenciales por primera vez.

  2. El ID de usuario del GUID dará un tamaño de índice mayor que un int, pero esto no es realmente significativo porque a menudo solo recuperamos 1 registro (usuario) a la vez y, en términos de fragmentación, el número de lecturas generalmente supera con creces el número de escrituras y ediciones. a una tabla de usuarios: la gente simplemente no actualiza esa información con tanta frecuencia.

  3. El script regsql que crea las tablas de membresía de aspnet se puede editar para que, en lugar de usar NEWID como valor predeterminado para el ID de usuario, pueda usar NEWSEQUENTIALID(), que ofrece un mejor rendimiento (he perfilado esto).

  4. Perfil.Alguien que esté creando un "nuevo sitio web de aprendizaje" no debería intentar reinventar la rueda.Uno de los sitios web para los que trabajé utilizó una versión lista para usar de las tablas de membresía de aspnet (excluyendo el horrible sistema de perfiles) y la tabla de usuarios contenía casi 2 millones de registros de usuarios.Incluso con una cantidad tan alta de registros, las selecciones aún eran rápidas porque, como dije al principio, los índices de la base de datos se enfocan en nombre de usuario reducido + ID de aplicación para realizar una búsqueda de índice agrupado para estos registros y, en términos generales, si SQL está realizando una búsqueda de índice agrupado para encontrar 1 registro, no tiene ningún problema, incluso con una gran cantidad de registros, siempre que no agregue columnas a las tablas y comience a extraer demasiados datos.

  5. Para mí, preocuparme por una guía en este sistema, según el rendimiento real y la experiencia del sistema, es una optimización prematura.Si tiene un int para su ID de usuario pero el sistema realiza consultas subóptimas debido a su diseño de índice personalizado, etc.el sistema no escalará bien.Los chicos de Microsoft hicieron un buen trabajo en general con la base de datos de membresía de aspnet y hay muchas cosas más productivas en las que concentrarse que cambiar el ID de usuario a int.

Usaría un número de incremento automático, generalmente un int.

Desea mantener el tamaño de la clave lo más pequeño posible.Esto mantiene su índice pequeño y también beneficia a las claves externas.Además, no está acoplando estrechamente el diseño de datos a los datos del usuario externo (esto también es válido para el GUID de aspnet).

Generalmente, los GUID no son buenas claves primarias, ya que son grandes y las inserciones pueden ocurrir potencialmente en cualquier página de datos dentro de la tabla en lugar de en la última página de datos.La principal excepción a esto es si está ejecutando varias bases de datos replicadas.Los GUID son muy útiles para las claves en este escenario, pero supongo que solo tienes una base de datos, por lo que esto no es un problema.

Si va a utilizar LinqToSql para el desarrollo, le recomendaría utilizar un Int como clave principal.Tuve muchos problemas cuando establecí relaciones a partir de campos que no eran Int, incluso cuando el campo nvarchar(x) tenía restricciones para convertirlo en un campo único.

No estoy seguro de si se trata de un error conocido en LinqToSql o qué, pero tuve problemas con él en un proyecto actual y tuve que intercambiar PK y FK en varias tablas.

Estoy de acuerdo con Mike Stone.También sugeriría utilizar únicamente un GUID en caso de que vaya a realizar un seguimiento de una enorme cantidad de datos.De lo contrario, será suficiente una simple columna de números enteros (Id) de incremento automático.

Si necesita el GUID, .NET es lo suficientemente bueno como para que pueda obtener uno con un simple...

Dim guidProduct As Guid = Guid.NewGuid()

o

Guid guidProduct = Guid.NewGuid();

También estoy de acuerdo con Mike Stone.Mi empresa implementó recientemente una nueva tabla de usuarios para clientes externos (a diferencia de los usuarios internos que se autentican a través de LDAP).Para los usuarios externos, elegimos almacenar el GUID como clave principal y almacenar el nombre de usuario como varchar con restricciones únicas en el campo de nombre de usuario.

Además, si va a almacenar el campo de contraseña, le recomiendo encarecidamente almacenar la contraseña como un binario con hash salado en la base de datos.De esta manera, si alguien pirateara su base de datos, no tendría acceso a las contraseñas de sus clientes.

Usaría el guid en mi código y, como ya mencioné, una dirección de correo electrónico como nombre de usuario.Después de todo, ya es único y memorable para el usuario.Tal vez incluso deshacerte de la guía (v.discutible).

Alguien mencionó el uso de un índice agrupado en el GUID si se estaba usando en su código.Yo evitaría esto, especialmente si los INSERT son altos;el índice se reconstruirá cada vez que INSERTE un registro.Sin embargo, los índices agrupados funcionan bien en ID de incremento automático porque solo se agregan registros nuevos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top