it-swarm.com.de

SimpleMembership mit benutzerdefiniertem Datenbankschema in ASP.NET MVC 4

Ich möchte die SimpleMembership-API von ASP.NET MVC 4 für die Integration in mein eigenes Datenbankschema aktivieren. Ich habe in meiner Datenbank eine einfache und einfache Tabelle namens Users mit folgenden Feldern:

  • Ich würde
  • Name
  • Passwort
  • Email
  • Ist gelöscht

Ich habe die SimpleMembership-API bereits für die Verwendung meiner Datenbank konfiguriert:

WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: true);

Und ich kann auch einen Benutzer einfügen:

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
                                 new 
                                 { 
                                        IsDeleted = false, 
                                        Email = "[email protected]"                
                                 });

Das Kennwortfeld (oder sein Hash) wird jedoch nicht in die Users-Tabelle eingefügt (natürlich), sondern in eine andere Tabelle namens webpages_Membership eingefügt, die mit dem Aufruf InitializeDatabaseConnection erstellt wird und viele unnötige Informationen enthält, die ich nicht benötige.

Ich habe auch andere automatisch erstellte Tabellen namens webpages_OAuthMembership, webpages_Roles und webpages_UsersInRoles, die ich nicht brauche.

Ich habe bereits versucht, die Tabellengenerierung auf false zu setzen:

WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: false);

In diesem Fall löst der CreateUserAndAccount-Aufruf jedoch eine Ausnahme aus, da die webpages_Membership-Tabelle nicht gefunden wird.

Es sieht so aus, als würden diese Tabellen benötigt, wenn ich die SimpleMembership-API verwenden möchte. 

Meine Frage ist die: Was soll ich in einem solchen Szenario tun, wenn ich nur eine einfache Variable Users und nichts mehr will?

Muss ich die gesamte Mitgliedschaftsverwaltung und die Authentifizierungslogik (Hashcode-Generierung usw.) selbst schreiben?

37
Zsolt

Ich stellte dem Produktteam dieselbe Frage.

Das Ziel der SIMPLE-Mitgliedschaft bestand darin, so einfach wie möglich zu arbeiten.

Es ist also wirklich keine Anpassung für die Tabellen möglich ... Die empfohlene Problemumgehung besteht darin, die ASP.NET-Mitgliedschaft (SqlMembershipProvider) weiterhin zu verwenden.

11
Max

Anpassung ist möglich.

Den Quellcode für SimpleMembershipProvider erhalten Sie von dem Projekt aspnetwebstack auf CodePlex , da hier die Zuordnung zwischen dem DB-Schema und der Laufzeitumgebung erfolgt usw., um Ihre Bedürfnisse zu erfüllen (ohne große Kopfschmerzen, IMO.)

10
Shaun Wilson

1 - Sie müssen Migrationen aktivieren, vorzugsweise mit EntityFramework 5. Verwenden Sie Enable-Migrations im NuGet-Paketmanager.

2 - Bewegen Sie Ihre 

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true); 

zu Ihrer Seed -Methode in Ihrer YourMvcApp/Migrations/Configuration.cs-Klasse

    protected override void Seed(UsersContext context)
    {
        WebSecurity.InitializeDatabaseConnection(
            "DefaultConnection",
            "UserProfile",
            "UserId",
            "UserName", autoCreateTables: true);

        if (!Roles.RoleExists("Administrator"))
            Roles.CreateRole("Administrator");

        if (!WebSecurity.UserExists("lelong37"))
            WebSecurity.CreateUserAndAccount(
                "lelong37",
                "password",
                new {Mobile = "+19725000000", IsSmsVerified = false});

        if (!Roles.GetRolesForUser("lelong37").Contains("Administrator"))
            Roles.AddUsersToRoles(new[] {"lelong37"}, new[] {"Administrator"});
    }

Nun ist EF5 für die Erstellung Ihrer UserProfile-Tabelle verantwortlich. Danach rufen Sie WebSecurity.InitializeDatabaseConnection auf, um nur SimpleMembershipProvider mit der bereits erstellten UserProfile-Tabelle zu registrieren. Außerdem wird SimpleMembershipProvider darüber informiert, welche Spalte die UserId und UserName ist. Ich zeige auch ein Beispiel, wie Sie Benutzer, Rollen hinzufügen und die beiden in Ihrer Seed - Methode mit benutzerdefinierten UserProfile-Eigenschaften Feldern verknüpfen können, z. Handy eines Benutzers (Nummer).

3 - Wenn Sie jetzt die update-database von der Package Manager Console aus ausführen, stellt EF5 Ihre Tabelle mit allen benutzerdefinierten Eigenschaften bereit

Weitere Verweise finden Sie in diesem Artikel mit dem Quellcode: / - http://blog.longle.io/2012/09/25/seeding-users-and-roles-with-mvc4-simplememhipprovider-simpleroleprovider- ef5-codefirst-and-custom-user-eigenschaften/

3
LeLong37

Dies funktioniert möglicherweise nicht für Ihren Anwendungsfall, aber Sie können Ihre Benutzerattribute natürlich sehr einfach der UserProfile-Tabelle zur Vereinfachung der Mitgliedschaft hinzufügen, anstatt eine andere Benutzertabelle zu erstellen

Ich würde empfehlen, die vorhandene Mitgliedschaftstabelle zu verwenden, um das gehashte Passwort zu behalten, und einfach die Felder zu ignorieren, die Sie nicht benötigen. Auf diese Weise bleibt die Kompatibilität mit SimpleMembership ohne großen Aufwand erhalten.

SQLMembership ist sehr einfach aus der Box. Ich habe umfangreiche Anpassungen an SQLMembership für ein paar Projekte vorgenommen, was nicht so schwierig war - aber im Rückblick wünschte ich, ich hätte es nicht getan. Es ist eine Art Wartungsaufwand,

2
Rohit

Sie können Ihren eigenen Mitgliedschaftsanbieter erstellen, indem Sie den MembershipProvider erweitern. Weitere Informationen finden Sie unter Custom MembershipProvider in .NET 4.0 . Bei diesem Ansatz müssen Sie nur die Methoden implementieren, die Sie benötigen. Dies sollte dazu beitragen, die Dinge einfacher zu gestalten, und Sie müssen nicht Tabellen hinzufügen, die Sie nicht benötigen.

Die grundlegenden Schritte (entnommen aus der verknüpften SO Antwort) sind:

  1. Erstellen Sie eine neue Klassendatei (wenn Sie kein mehrschichtiges System im Ordner "Models" Ihres Projekts verwenden), nennen Sie sie "MyMembershipProvider.cs"
  2. Vererben Sie diese Klasse von System.Web.Security.MembershipProvider
  3. Automatische Erstellung der benötigten Methoden (Punkt + Leerzeichen in der Vererbungsklasse)
2
oalbrecht

Sie können OAUth mit ASP.NET Universal Providers verwenden. Universalanbieter sind die neue Version von SQL-Mitgliedsanbietern. Diese basieren auf EF CodeFirst und generieren ein saubereres Schema Ihrer Datenbank Weitere Informationen finden Sie in meinem folgenden Beitrag http://blogs.msdn.com/b/pranav_rastogi/archive/2012/ 09/12/integrieren-openauth-openid-mit-Ihrer-bestehenden-asp-net-anwendung-using-universal-provider.aspx

2
pranav rastogi

Sie können sowohl Ihre benutzerdefinierte Benutzertabelle als auch die SimpleMembership-Tabellen verwenden. Diese Methode hat in der Vergangenheit für mich gut funktioniert. 

In Ihrer Register-Methode im AccountController würden Sie beispielsweise einen neuen Benutzer registrieren, indem Sie ihn zu Ihrer eigenen Benutzertabelle hinzufügen. Fügen Sie diesen Benutzer dann der SimpleMembership UserProfile-Tabelle hinzu, und verwenden Sie dabei die ID des Benutzers, den Sie der Users-Tabelle hinzugefügt haben. 

using (var context = new MyDatabaseEntities())
{
    User newUser = new User(){
      Name = model.Name,
      Email = model.Email,
      IsDeleted = false
    }

    // Add the user to your custom Users table
    context.Users.Add(newUser);
    context.SaveChanges();

    // Add this user to the SimpleMembership table using the same Id as the custom Users table
    WebSecurity.CreateUserAndAccount(newUser.Id.ToString(), model.Password);

    // Log the user in
    WebSecurity.Login(newUser.Id.ToString(), model.Password);
}
0
oalbrecht