8

Also, ich erstelle eine ASP.NET MVC-Website.Wo speicher ich zusätzliche Benutzerdetails mit ASP.NET MVC und dem SqlMembershipProvider?

Es hat eine ziemlich komplexe Benutzer-Anmeldeseite mit vielen Feldern. Meine Frage ist, wo soll ich das bestehen? Die Benutzertabellen, die vom Mitgliedschaftsanbieter-Tool erstellt wurden, enthalten diese Spalten nicht und ich bin verwirrt darüber, was die beste Vorgehensweise ist, um diese zusätzlichen Informationen über jeden Benutzer zu speichern.

Kommt hier ein Profilanbieter ins Spiel? Wie arbeiten Sie? Wenn nicht, wie beharren Sie sonst und speichern Sie die zusätzlichen Benutzerdetails, die nicht in den Bestandsspalten der MembershipProvider-Tabellen enthalten sind?

Kann mich jemand auf einige Ressourcen zeigen, wie diese verarbeitet wird, wie diese zusätzlichen Benutzerdaten zugreifen, wenn ich sie brauche, wie einen neuen Benutzer mit all diesen Informationen erstellen usw.

Antwort

3

Hier kommt der ASP.NET-Profilanbieter ins Spiel. Sie können damit beliebige Profilinformationen zu einem Benutzer speichern. Sie müssen lediglich die benötigten Felder in der Datei web.config, MSDN Link on how to configure the profile fields in web.config file, hinzufügen. Um den Artikel zusammenzufassen, fügen Sie einfach den Namen und die Typwerte hinzu, die Sie speichern möchten, in den Knoten Eigenschaften des Profilelements. Hier ein Beispiel:

<profile enabled="true"> 
    <properties> 
    <add name="Name" /> 
    <group name="Address"> 
     <add name="Street" /> 
     <add name="City" /> 
     <add name="Zip" type="System.Int32" /> 
    </group> 
    </properties> 
</profile> 

In ASP.NET Webforms, Visual Studio erstellt automatisch eine stark typisierte Profilklasse, die Ihre individuellen Profileigenschaften Referenz wird. In MVC passiert das nicht. Um auf die Profilinformationen eines Benutzers zu verweisen, rufen Sie einfach HttpContext.Profile ["PropertyName"] auf. Ein Beispiel:

HttpContext.Profile["Name"] = name; 
HttpContext.Profile.GetProfileGroup("Address")["Zip"] = zip; 

Edit: Wie Andy erwähnt, ist die Standard-SqlProfileProvider mit nicht wirklich gut, wenn Sie Fragen zu diesen Eigenschaften ausgeführt werden soll. Er hat vollkommen recht, und vielleicht hätte ich diese Beschränkung ursprünglich bemerken sollen. Diese Einschränkung besteht, da SqlProfileProvider alle Profildaten in drei Spalten speichert: PropertyNames und PropertyValuesString/PropertyValuesBinary. Alle Schlüssel werden im Feld PropertyNames gespeichert, Werte, die als String gespeichert werden können, werden im Feld PropertyValuesString usw. gespeichert. Dies bedeutet, dass es extrem schwierig ist, eine Abfrage wie "Select * from aspnet_Profile wo Age> 10" auszuführen.

3

Ich bin nicht wirklich sicher, es gibt eine Best Practice und es hängt wirklich davon ab, wie Sie die Informationen verwenden möchten.

Zuerst müssen Sie die Mitgliedschaft erkennen und Profile sind zwei verschiedene Dinge. Die ASP.NET-Funktion für Mitgliedschaft, Profil und Rolle wurde als Dienst für mehrere Websites/Anwendungen konzipiert.

Wenn Sie sich das Schema für diese Beziehungen ansehen, werden Sie feststellen, dass Benutzer für das System eindeutig sind, ein Benutzer jedoch für verschiedene Anwendungen freigegeben werden kann. Das bedeutet, dass ihre Profilinformationen auch über die Anwendungen verteilt werden. Mitgliedschaft ist eigentlich die Zuordnung eines Benutzers zu einer Anwendung und enthält Informationen über ihre Beziehung zu dieser bestimmten Anwendung (Passwort, Passwort Q & A, etc).

Sie können den Profilanbieter wie von Ryan vorgeschlagen verwenden, aber 1) dass Informationen nicht leicht abgefragt werden können, wenn Sie Profilmetriken sammeln möchten und 2) sie von allen Benutzern der Mitgliedschafts-/Profildienste geteilt werden. Sie können es jedoch erweitern, um Ihre Bedürfnisse zu erfüllen.Sie können den Mitgliedschaftsanbieter wie von Gortok vorgeschlagen erweitern, und zwar relativ zur Anwendung, aber Sie müssen sicherstellen, dass Sie vorhandene Benutzer des Dienstes nicht durch Ändern der vorhandenen gespeicherten Prozeduren oder Tabellen in einer Weise brechen, die dies erfordert ändert ihre Schnittstelle oder Absicht. Die andere Option ist, dass Sie sie als Dienst behandeln und diese Informationen selbst nachverfolgen können, indem Sie auf die eigene Profilimplementierung verweisen, indem Sie die Benutzer-ID des asp.net sql-Anbieters verwenden.

Es gibt eine gute Serie (16 Teile) über Membership, Profiles, and Roles über 4 Jungs aus Rolla, die ich empfehlen würde zu lesen und dann, sobald Sie mit allen beweglichen Teilen vertraut sind, eine fundierte Entscheidung treffen, wo am besten speichern und wie Sie die Profilinformationen, die Sie erstellen möchten, am besten strukturieren.

2

Ich weiß, dass dieser Beitrag für eine lange Zeit veröffentlicht wurde, und der Fragekontext war wahrscheinlich für MVC2 oder früher.

Es ist jetzt mvc3, und ich dachte, dass vielleicht andere, die Antworten für den mvc5-Kontext suchen, an dieser Lösung interessiert sein könnten.

In einem Standard-mvc5 Projekt, das Konto einzelne Benutzer hat aktiviert Sie den folgenden Codeblock bereit für den Einsatz in {} Projekt /Models/IdentityModel.cs

// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more. 
public class ApplicationUser : IdentityUser 
{ 
} 

einfach in mehr Eigenschaften dieses Add finden Klasse und die Eigenschaften werden in der Datenbank gespeichert Eg.

public class ApplicationUser : IdentityUser 
{ 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Email { get; set; } 
     public bool Active { get; set; } 
     public DateTime DateRegistered { get; set; } 
} 
Verwandte Themen