Sollte ich benutzen den Benutzernamen oder die Benutzer-ID Referenz authentifizierte Benutzer in ASP.NET

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

  •  08-06-2019
  •  | 
  •  

Frage

Also in meinem einfach zu lernen website, die ich verwenden die gebaut in ASP.NET authentication system.

Ich füge nun eine user-Tabelle zu speichern Dinge wie seine zip, DOB etc.Meine Frage ist:

  1. In der neuen Tabelle, sollte der Schlüssel sein, den Benutzernamen (die Zeichenfolge) oder die Benutzer-ID, die GUID Nummer suchen, die Sie in der asp_ tables.
  2. Wenn die beste Praxis ist die Verwendung von hässlichen guid, wer weiß, wie um es zu bekommen?es scheint nicht zugegriffen werden sich so leicht wie der name (System.Web.HttpContext.Current.User.Identity.Name)
  3. Wenn Sie vorschlagen, ich nutze weder (nicht die guid noch die Felder für den Benutzernamen zur Verfügung gestellt von ASP.NET Authentifizierung), dann wie mache ich es mit ASP.NET Authentifizierung?Eine option, die ich mag, ist die Verwendung der E-Mail-Adresse des Benutzers, wie login, aber wie soll ich machen ASP.NET authentication-system verwenden, eine E-Mail-Adresse statt eines Benutzernamens?(oder ist es nichts zu tun gibt, es ist einfach mich zu entscheiden, ich "weiß" userName tatsächlich eine E-Mail-Adresse?

Bitte beachten Sie:

  • Ich bin nicht zu Fragen, wie Sie eine GUID .NET, ich bin nur bezogen auf die userID-Spalte in der asp_ tables als guid.
  • Der Benutzername ist einzigartig in ASP.NET Authentifizierung.
War es hilfreich?

Lösung

Ich würde vorschlagen, mit den Benutzernamen, die als Primärschlüssel in der Tabelle, wenn der Benutzername wird einzigartig sein, es gibt ein paar gute Gründe, dies zu tun:

  1. Der primäre Schlüssel eines gruppierten Indexes und damit der Suche nach einer Benutzer-details über Ihre Benutzername wird dann sehr schnell.
  2. Es wird stop doppelten Usernamen angezeigt
  3. Sie nicht haben, um sorgen über die Verwendung von zwei verschiedenen Stücke von Informationen (Benutzername oder guid)
  4. Es macht das schreiben von code viel einfacher, weil Sie nicht mit Nachschlage-zwei bits von Informationen.

Andere Tipps

Sie sollte verwenden einige einzigartige ID, die GUID, die Sie erwähnen oder eine andere auto-generierten Schlüssel.Allerdings sollte diese Zahl nie für den Benutzer sichtbar sein.

Ein großer Vorteil dieser ist, dass Ihr gesamter code arbeiten können, die Benutzer-ID, aber der name des Benutzers ist nicht wirklich an Sie gebunden.Dann, die Benutzer können ändern Ihre Namen (die ich gefunden habe, nützlich auf Websites).Dies ist besonders hilfreich, wenn Sie E-Mail-Adresse als Benutzer-login -...das ist sehr praktisch für Benutzer (dann Sie nicht haben zu erinnern Sie sich 20-IDs in Fall Ihre gemeinsame Benutzer-ID ist eine beliebte one).

Sollten Sie die Benutzer-id.Es ist die ProviderUserKey Eigentum von MembershipUser.

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

Ich würde verwenden Sie eine Benutzerkennung.Wenn Sie möchten, verwenden Sie einen Benutzernamen, den Sie gehen, um die "username ändern" - Funktion sehr teuer.

Ich Stimme mit Palmsey, Obwohl es scheint zu sein, ein wenig Fehler in seinem code:

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

sollte

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

Ich würde sagen, verwendet die Benutzer-id, also Benutzernamen können noch verändert werden, ohne den Primärschlüssel.Ich würde auch den username-Spalte eindeutig zu stoppen doppelten Usernamen.

Wenn Sie vor allem die Suche nach Benutzernamen, anstatt UserID dann machen Benutzernamen ein clustered-index und legen Sie den Primärschlüssel nicht gruppierten.Dadurch erhalten Sie den schnellsten Zugang bei der Suche nach Benutzernamen, wenn Sie jedoch hauptsächlich auf der Suche nach Benutzerkennungen, verlassen Sie diese als gruppierten index.

Edit :Diese passen auch besser mit dem aktuellen ASP.Net Mitgliedschaft Tabellen als auch die UserID als Primärschlüssel.

Dies ist alt, aber ich will einfach Menschen, die finden dies einige Dinge beachten:

  1. Das aspnet-Mitgliedschaft-Datenbank WIRD optimiert, wenn es um den Zugriff auf Benutzer-Datensätze.Der clustered index seek (optimale) in sql server wird verwendet, wenn ein Datensatz gesucht, mit loweredusername und applicationid.Das macht sehr viel Sinn, da wir nur den angegebenen Benutzernamen zu gehen, wenn der Benutzer sendet zuerst Ihre Anmeldeinformationen.

  2. Die guid userid geben einen größeren index Größe als ein int, aber das ist nicht wirklich wichtig, weil wir oft abrufen nur 1 Datensatz (Benutzer), zu einem Zeitpunkt und in Bezug auf die Fragmentierung, die Anzahl der Lesevorgänge in der Regel die großartige überwiegt die Anzahl der Schreibzugriffe und änderungen in der Benutzer-Tabelle - die Leute einfach nicht aktualisieren diese info so oft.

  3. die regsql Skript erstellt die aspnet-Mitgliedschaft Tabellen können bearbeitet werden, so dass anstelle der Verwendung von NEWID als Standard für die Benutzer-id, es kann die Verwendung von NEWSEQUENTIALID() liefert eine bessere Leistung (ich habe profilierten diese).

  4. Profil.Jemand, die Schaffung einer "neuen Lern-website" man sollte nicht versuchen, das Rad neu zu erfinden.Eine der websites, für die ich gearbeitet habe, verwendet ein von der box-version des aspnet-Mitgliedschaft Tabellen (mit Ausnahme der schreckliche-Profil-system) und die Benutzer-Tabelle, die knapp 2 Millionen Nutzer-Datensätze.Sogar mit einer hohen Anzahl von Datensätzen, wählt wurden noch schnell, weil, wie ich sagte, um mit zu beginnen, die Datenbank-Indizes konzentrieren sich auf loweredusername+applicationid zu Registrierungsvorgang clustered index seek für diese Datensätze und generell, wenn sql ist dabei ein clustered-index-Suche finden Sie 1-Datensatz, Sie haben auch keine Probleme, selbst mit einer großen Anzahl von Datensätzen zur Verfügung gestellt, dass Sie nicht hinzufügen von Spalten zu Tabellen und starten Sie ziehen wieder zu viel Daten.

  5. Gedanken über eine guid in diesem system, für mich, basierend auf der tatsächlichen Leistung und die Benutzerfreundlichkeit des Systems, ist eine vorzeitige Optimierung.Wenn Sie eine int für Ihre userid aber das system führt die suboptimale Abfragen, weil Ihre benutzerdefinierten index design, uvm.das system wird nicht gut skalieren.Das Microsoft-Team hat generell eine gute Arbeit mit den aspnet-Mitgliedschaft db und es gibt viele weitere produktive Dinge zu konzentrieren, als die änderung der userId int.

Ich würde verwenden Sie eine automatische Inkrementierung der Anzahl in der Regel ein int.

Sie wollen, um die Größe der Schlüssel so klein wie möglich.Dies hält Ihre index kleine und Vorteile für alle foreign keys als gut.Additonally Sie sind nicht eng Kopplung der Daten-design zu externen Benutzer-Daten (dies gilt auch für das aspnet-GUID als gut).

In der Regel GUIDs machen keine guten Primärschlüssel, da Sie groß und inserts können vorkommen, in potenziell jeder Seite mit Daten in der Tabelle anstatt auf Daten der letzten Seite.Die wichtigste Ausnahme ist, wenn Sie mit mutilple replizierten Datenbanken.GUIDs sind sehr nützlich für die Tasten in diesem Szenario, aber ich vermute, Sie haben nur eine Datenbank, so ist dies kein problem.

Wenn du gehst zu sein mit LinqToSql für die Entwicklung, würde ich empfehlen, mit einem Int als Primärschlüssel.Ich habe viele Probleme, wenn ich hatte Beziehungen, gebaut aus der nicht-Int-Felder, auch wenn der nvarchar(x) - Feld hatte Einschränkungen zu machen es zu einem einzigartigen Bereich.

Ich bin mir nicht sicher, ob dies ein bekannter Fehler in LinqToSql oder was, aber ich habe Probleme mit es auf einem aktuellen Projekt, und ich hatte zu tauschen PKs und FKs auf mehrere Tabellen.

Ich Stimme mit Mike Stone.Ich würde auch vorschlagen, nur mit einer GUID in der Veranstaltung, die Sie gehen, um tracking eine enorme Menge an Daten.Ansonsten ein einfacher auto-increment integer (Id) Spalte genügt.

Wenn Sie müssen die GUID .NET ist schön genug, dass man von einem einfachen...

Dim guidProduct As Guid = Guid.NewGuid()

oder

Guid guidProduct = Guid.NewGuid();

Ich bin einverstanden mit Mike Stone auch.Meine Firma hat vor kurzem eine neue Benutzer-Tabelle für externe Kunden (im Gegensatz zu internen Anwender, die die Authentifizierung über LDAP).Für die externen Benutzer, haben wir uns entschieden speichern Sie die GUID als Primärschlüssel aus, und speichern Sie den Benutzernamen als varchar mit einzigartigen Einschränkungen auf das Feld Benutzername.

Auch, wenn Sie zum speichern der Passwort-Feld, ich empfehle speichern Sie das Passwort als gesalzener, binary Hash in der Datenbank.Auf diese Weise, wenn jemand hacken Ihre Datenbank, Sie würde haben keinen Zugriff auf Ihre Kunden-Passwörter.

Ich würde verwenden Sie die guid in meinem code und wie bereits erwähnt eine E-Mail-Adresse als Benutzername.Es ist, nachdem alle, die bereits einzigartig und unvergesslich für die Benutzer.Vielleicht sogar Graben Sie die guid (v.fraglich).

Jemand erwähnte, mit einem gruppierten index auf die GUID, wenn dies in Ihrem code.Ich würde dies vermeiden, vor allem, wenn Einsätze sind hohe;der index neu erstellt jedes mal, wenn Sie einen Datensatz EINFÜGEN.Clustered-Indizes funktionieren gut auf auto-Inkrement-IDs, obwohl, weil neue Datensätze angehängt werden nur.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top