2010-03-27 2 views
5

Ich verwende den ASP.NET SQL-Mitgliedschaftsanbieter. Also, es gibt eine aspnet_Users Tabelle, die Details zu jedem meiner Benutzer enthält. (Tatsächlich scheint die aspnet_Membership Tabelle die meisten der tatsächlichen Daten zu enthalten).Verwenden Sie ASP.NET SQL-Mitgliedschaftsanbieter, wie speichere ich meine eigenen Benutzerdaten?

Ich möchte jetzt einige Benutzerinformationen in meiner Datenbank speichern, also dachte ich, ich würde nur eine neue Tabelle mit einer UserId (GUID) -Spalte und eine FK-Beziehung zu aspnet_Users erstellen. Allerdings habe ich dann festgestellt, dass ich nicht leicht Zugriff auf die UserId bekommen, da es nicht über die Mitgliedschaft API ausgesetzt ist. (Ich weiß, ich kann es über die ProviderUserKey zugreifen, aber es scheint, wie die API abstrahiert die interne UserID zugunsten der , und ich möchte nicht zu weit gegen den Strich gehen).

Also, ich dachte, ich sollte stattdessen eine LoweredUserName Spalte in meinem Tisch, und erstellen Sie eine FK Beziehung zu aspnet_Users, dass die Verwendung. Bzzzt. Wieder falsch, denn während aspnet_Users die LoweredUserName enthält, enthält es auch die ApplicationId - also, um meine FK-Beziehung zu erstellen, müsste ich auch eine ApplicationId Spalte in meiner Tabelle haben.

Zuerst dachte ich: Gut, ich habe es nur mit einer einzigen Anwendung zu tun, also werde ich einfach eine solche Spalte hinzufügen und ihr einen Standardwert geben. Dann erkannte ich, dass die ApplicationId eine GUID ist, also wäre es ein Schmerz, dies zu tun. Nicht hart genau, aber bis ich meine DB ausrollen kann ich nicht vorhersagen, was die GUID wird.

Ich habe das Gefühl, dass ich etwas vermisse oder Dinge falsch mache. Was soll ich tun angenommen zu tun?

Antwort

9

Ich denke, Sie suchen nach dem ProfileProvider, mit dem Sie beliebige beliebige Informationen mit dem Benutzer verknüpfen können.

ASP.NET Profile Properties Overview

ADDITION Wenn die eingebaut in Profilen Ihren Bedürfnissen nicht passen, dann könnten Sie Ihre eigenen Profile Implementierung von einer Klasse zu schreiben, die von System.Web.Profile.ProfileProvider ableitet. Dies würde Ihnen ermöglichen, etwas zu schreiben, das die Serialisierungsprobleme vermeidet, die Sie in Ihrem Kommentar erwähnten.

Implementing a Profile Provider

ADDITION Hinweis über die SqlMembershipProvider. Sie sind in der Tat richtig, dass die Membership-Klassen wirklich auf den Benutzernamen getastet werden, obwohl das Schema auf UserId codiert ist. Dies ist ehrlich gesagt eine meiner Lieblingsfragen bezüglich der SqlMembershipProvider-Klassen. Dies führt zu Problemen in einer Umgebung mit mehreren Anwendungen, in der Sie einen einzelnen Benutzerspeicher aber unabhängige Anwendungsrollenlisten möchten.

Meine Empfehlung wäre, auf UserId zu schlüsseln, da es, wie Sie erwähnten, der Primärschlüssel der Tabelle aspnet_Users ist und in allen Fremdschlüsselbeziehungen verwendet wird, und es ist ein einzelner Wert. Wenn Sie auf "LowerUsername" (und "ApplicationId") klicken und sich der Nutzername ändert, muss Kaskadenaktualisierung aktiviert sein, damit die Änderungen in Ihren benutzerdefinierten Tabellen kräuseln.

+0

Und auch du +1. Tippcodeblöcke bekommen Aufmerksamkeit. ;-) –

+1

Danke, aber ich denke nicht, dass die Daten, die ich speichern muss, gut im serialisierten Format sitzen würden. Ich muss Joins mit verschiedenen anderen Tabellen machen, die ich bereits in meiner Datenbank habe. Ich würde es vorziehen, meine Benutzerdaten in Tabellen zu haben, gegen die ich effizient Abfragen ausführen kann. Obwohl ich eine Verwendung für den Profilspeicher sehen kann, passt es nicht zu meiner Situation. +1 sowieso. –

5

Um dies zu tun, können Sie einen Profilanbieter implementieren. Es ist nicht sehr schwierig. Sie werden im Grunde Ihre benutzerspezifischen Einstellungen wie folgt einrichten:

(Web.config):

<profile enabled="true" defaultProvider="MyProvider"> 
    <providers> 
     <add name="MyProvider" connectionStringName="MembershipCnnStr" applicationName="MyApp" type="System.Web.Profile.SqlProfileProvider"/> 
    </providers> 
    <properties> 
     <add name="EmployeeId" type="String" /> 
     <group name="UserSettings"> 
      <add name="IsSandboxMode" type="Boolean" defaultValue="false" /> 
      <add name="Shortcuts" type="System.Collections.Generic.List`1[System.string]" /> 
     </group> 
    </properties> 
</profile> 
+0

SIE WIEDER! +1 ;-) –

+1

Bitte sehen Sie meinen Kommentar zu Thomas 'Antwort - Ich möchte keinen Profilspeicher verwenden, sondern eine echte Datenbanktabelle. Danke trotzdem, und +1 für das Detail. –

+0

In diesem Fall sollten Sie, genau wie Thomas gesagt hat, Ihren eigenen benutzerdefinierten Anbieter schreiben, der Ihre Datenbank verwendet. –

3

Wenn Sie einfach Daten an das Hinzufügen gebunden an die Benutzer, wie hinzugefügt Profileigenschaften suchen, sollten Sie in Personalization aussehen.

Wenn Sie beispielsweise den Mädchennamen einer Mutter als Teil ihrer Profilinformationen speichern möchten, können Sie diese Funktion verwenden.

Es ist wahrscheinlich nicht die richtige Wahl für komplexe Daten, aber es ist ein Anfang.

+0

Sie alle gleichzeitig mit gültiger Antwort so +1 beantwortet. –

+0

Ich hätte von Anfang an sagen sollen, dass ich eine ganze Reihe existierender Datenbanktabellen habe, und ich muss in der Lage sein, meine (komplexen) Benutzerdaten in einer Tabelle zu speichern, der ich mich anschließen kann. Also wird Profiles nicht wirklich geeignet sein. +1 für Ihre (angemessene) Einschränkung. –

1

schreiben CS-Datei wie

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     FirstNameTextBox.Text = Server.HtmlDecode(Profile.FirstName); 
     LastNameTextBox.Text = Server.HtmlDecode(Profile.LastName); 

    } 

} 

und web.config

<profile> 
    <providers> 
     <add name="FirstName" type="System.String"/> 
     <add name="LastName" type="System.String"/> 
     <add name="MemberId" defaultValue="0" type="System.Int32"/> 
    <clear/> 
    <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> 
    </providers> 
</profile>