Dovrei utilizzare il nome utente o l'ID dell'utente per fare riferimento agli utenti autenticati in ASP.NET

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

  •  08-06-2019
  •  | 
  •  

Domanda

Pertanto, nel mio semplice sito Web di apprendimento, utilizzo il sistema di autenticazione ASP.NET integrato.

Sto aggiungendo ora una tabella utente per salvare cose come il suo zip, DOB ecc.La mia domanda è:

  1. Nella nuova tabella, la chiave dovrebbe essere il nome utente (la stringa) o l'ID utente che è il numero di aspetto GUID utilizzato nella asp_ tables.
  2. Se la pratica migliore è usare quella brutta guida, qualcuno sa come ottenerla?sembra non essere accessibile così facilmente come il nome (System.Web.HttpContext.Current.User.Identity.Name)
  3. Se suggerisci di non utilizzare nessuno dei due (non i campi GUID né UserName forniti dall'autenticazione ASP.NET), come posso farlo con l'autenticazione ASP.NET?Un'opzione che mi piace è utilizzare l'indirizzo e-mail dell'utente come accesso, ma come posso fare in modo che il sistema di autenticazione ASP.NET utilizzi un indirizzo e-mail anziché un nome utente?(o non c'è niente da fare lì, sono solo io che decido di "so" che userName è in realtà un indirizzo email?

Notare che:

  • Non sto chiedendo come ottenere un GUID in .NET, mi riferisco solo alla colonna userID nel file asp_ tables come guida.
  • Il nome utente è univoco nell'autenticazione ASP.NET.
È stato utile?

Soluzione

Suggerirei di utilizzare il nome utente come chiave primaria nella tabella se il nome utente sarà univoco, ci sono alcuni buoni motivi per farlo:

  1. La chiave primaria sarà un indice cluster e quindi la ricerca dei dettagli di un utente tramite il suo nome utente sarà molto rapida.
  2. Impedirà la visualizzazione di nomi utente duplicati
  3. Non devi preoccuparti di utilizzare due diverse informazioni (nome utente o guid)
  4. Renderà la scrittura del codice molto più semplice poiché non sarà necessario cercare due bit di informazione.

Altri suggerimenti

Dovresti utilizzare un ID univoco, il GUID menzionato o qualche altra chiave generata automaticamente.Tuttavia, questo numero non dovrebbe mai essere visibile all'utente.

Un enorme vantaggio di questo è che tutto il tuo codice può funzionare sull'ID utente, ma il nome dell'utente non è realmente legato ad esso.Quindi, l'utente può cambiare il proprio nome (cosa che ho trovato utile sui siti).Ciò è particolarmente utile se si utilizza l'indirizzo e-mail come accesso dell'utente...il che è molto comodo per gli utenti (in questo modo non devono ricordare 20 ID nel caso in cui il loro ID utente comune sia popolare).

Dovresti usare l'ID utente.È la proprietà ProviderUserKey di MembershipUser.

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

Vorrei utilizzare un ID utente.Se desideri utilizzare un nome utente, renderai molto costosa la funzione "cambia nome utente".

Sono d'accordo con Palmsey, anche se sembra esserci un piccolo errore nel suo codice:

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

dovrebbe essere

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

Direi di utilizzare l'ID utente in modo che i nomi utente possano ancora essere modificati senza influire sulla chiave primaria.Vorrei anche impostare la colonna nome utente in modo che sia univoca per impedire nomi utente duplicati.

Se effettuerai la ricerca principalmente in base al nome utente anziché all'ID utente, imposta Nome utente come indice cluster e imposta la chiave primaria su non cluster.Questo ti darà l'accesso più veloce durante la ricerca dei nomi utente, se tuttavia cercherai principalmente UserId, lascialo come indice cluster.

Modificare :Ciò si adatterà meglio anche alle attuali tabelle di appartenenza ASP.Net poiché utilizzano anche l'ID utente come chiave primaria.

Questo è vecchio ma voglio solo che le persone che lo trovano notino alcune cose:

  1. Il database dei membri di ASPNET È ottimizzato per quanto riguarda l'accesso ai record degli utenti.La ricerca dell'indice cluster (ottimale) in SQL Server viene utilizzata quando viene cercato un record utilizzando loweredusername e applicationid.Ciò ha molto senso poiché abbiamo solo il nome utente fornito da utilizzare quando l'utente invia per la prima volta le proprie credenziali.

  2. L'ID utente guid fornirà una dimensione dell'indice maggiore di un int ma questo non è realmente significativo perché spesso recuperiamo solo 1 record (utente) alla volta e in termini di frammentazione, il numero di letture di solito supera di gran lunga il numero di scritture e modifiche a una tabella utenti: le persone semplicemente non aggiornano tali informazioni così spesso.

  3. lo script regsql che crea le tabelle di appartenenza aspnet può essere modificato in modo che invece di utilizzare NEWID come predefinito per userid, possa utilizzare NEWSEQUENTIALID() che offre prestazioni migliori (ho profilato questo).

  4. Profilo.Qualcuno che crea un "nuovo sito web di apprendimento" non dovrebbe provare a reinventare la ruota.Uno dei siti Web per cui ho lavorato utilizzava una versione pronta all'uso delle tabelle di appartenenza di Aspnet (escluso l'orribile sistema di profili) e la tabella degli utenti conteneva quasi 2 milioni di record di utenti.Anche con un numero così elevato di record, le selezioni sono state comunque veloci perché, come ho detto all'inizio, gli indici del database si concentrano su nomeutente+IDapplicazione abbassato per eseguire la ricerca dell'indice cluster per questi record e in generale, se SQL sta eseguendo una ricerca dell'indice cluster per trovare 1 record, non hai problemi, anche con un numero enorme di record, a patto di non aggiungere colonne alle tabelle e iniziare a recuperare troppi dati.

  5. Preoccuparsi di una guida in questo sistema, per me, in base alle prestazioni effettive e all'esperienza del sistema, è un'ottimizzazione prematura.Se hai un int per il tuo ID utente ma il sistema esegue query non ottimali a causa del design dell'indice personalizzato, ecc.il sistema non si adatterà bene.I ragazzi di Microsoft hanno fatto generalmente un buon lavoro con il db di appartenenza di aspnet e ci sono molte cose più produttive su cui concentrarsi rispetto alla modifica di userId in int.

Utilizzerei un numero a incremento automatico, solitamente un int.

Vuoi mantenere la dimensione della chiave quanto più piccola possibile.Ciò mantiene il tuo indice piccolo e avvantaggia anche eventuali chiavi esterne.Inoltre non stai accoppiando strettamente la progettazione dei dati ai dati dell'utente esterno (questo vale anche per il GUID di aspnet).

In genere i GUID non costituiscono buone chiavi primarie poiché sono grandi e gli inserimenti possono avvenire potenzialmente in qualsiasi pagina di dati all'interno della tabella anziché nell'ultima pagina di dati.L'eccezione principale a ciò si verifica se si eseguono più database replicati.I GUID sono molto utili per le chiavi in ​​questo scenario, ma suppongo che tu abbia solo un database, quindi questo non è un problema.

Se utilizzerai LinqToSql per lo sviluppo, ti consiglio di utilizzare Int come chiave primaria.Ho avuto molti problemi quando avevo relazioni costruite su campi non Int, anche quando il campo nvarchar(x) aveva dei vincoli per renderlo un campo univoco.

Non sono sicuro che si tratti di un bug noto in LinqToSql o cosa, ma ho riscontrato problemi su un progetto attuale e ho dovuto scambiare PK e FK su diversi tavoli.

Sono d'accordo con Mike Stone.Suggerirei anche di utilizzare un GUID solo nel caso in cui intendi monitorare un'enorme quantità di dati.Altrimenti, sarà sufficiente una semplice colonna intera (Id) con incremento automatico.

Se hai bisogno del GUID, .NET è abbastanza carino da poterne ottenere uno con un semplice...

Dim guidProduct As Guid = Guid.NewGuid()

O

Guid guidProduct = Guid.NewGuid();

Sono d'accordo anche con Mike Stone.La mia azienda ha recentemente implementato una nuova tabella utenti per i clienti esterni (a differenza degli utenti interni che si autenticano tramite LDAP).Per gli utenti esterni, abbiamo scelto di archiviare il GUID come chiave primaria e di archiviare il nome utente come varchar con vincoli univoci sul campo nome utente.

Inoltre, se intendi archiviare il campo della password, ti consiglio vivamente di archiviare la password come file binario con hash e sale nel database.In questo modo, se qualcuno dovesse hackerare il tuo database, non avrebbe accesso alle password dei tuoi clienti.

Vorrei utilizzare il guid nel mio codice e, come già menzionato, un indirizzo email come nome utente.Dopotutto, è già unico e memorabile per l'utente.Forse anche abbandonare il guid (v.discutibile).

Qualcuno ha menzionato l'utilizzo di un indice cluster sul GUID se questo veniva utilizzato nel codice.Lo eviterei, soprattutto se gli INSERT sono alti;l'indice verrà ricostruito ogni volta che INSERISCI un record.Gli indici cluster funzionano bene con gli ID a incremento automatico perché vengono aggiunti solo i nuovi record.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top