37 votes

SimpleMembership avec schéma de base de données personnalisé dans ASP.NET MVC 4

Je veux permettre à l'ASP.NET MVC 4 SimpleMembership API de l'intégrer à mon propre schéma de base de données. J'ai une pure et simple de la table dans ma base de données appelée Users avec les champs suivants:

  • Id
  • Nom
  • Mot de passe
  • E-mail
  • IsDeleted

J'ai déjà configuré le SimpleMembership API à utiliser ma base de données:

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

Et je peux insérer un utilisateur trop:

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
                                 new 
                                 { 
                                        IsDeleted = false, 
                                        Email = "sampledata@gmail.com"                
                                 });

Cependant, le champ Mot de passe (ou hash) n'est pas inséré dans la table des Utilisateurs (bien sûr), il insérée dans une autre table appelée webpages_Membership qui est créé avec l' InitializeDatabaseConnection appel et contient beaucoup d'informations inutiles qui je n'ai pas besoin.

Aussi, j'ai d'autres automatiquement créé des tableaux appelé webpages_OAuthMembership, webpages_Roles et webpages_UsersInRoles qui je n'ai pas besoin.

J'ai déjà essayé de mettre la table génération de faux:

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

Mais dans ce cas, le CreateUserAndAccount appel lèvera une exception car il ne sera pas trouver le webpages_Membership table.

Il semble que ces tables nécessaires lorsque je veux utiliser le SimpleMembership API.

Ma question est: que dois-je faire dans un tel scénario, lorsque je veux seulement un simple Users tableau et rien de plus?

Dois-je écrire l'ensemble des membres de la manipulation et de la logique d'authentification (code de hachage de génération, etc...) moi-même?

11voto

Max Points 959

J'ai posé la même question à l'équipe produit.

L’objectif de conception de l’adhésion à SIMPLE était de fonctionner de manière aussi simple que possible.

Il n'y a donc vraiment pas de personnalisation possible en ce qui concerne les tables. La solution de contournement recommandée consiste à continuer à utiliser l’adhésion ASP.NET (SqlMembershipProvider).

10voto

Shaun Wilson Points 2363

La personnalisation est possible.

Vous pouvez obtenir le code source pour SimpleMembershipProvider de la aspnetwebstack projet sur CodePlex, car c'est là où la mise en correspondance se produit entre la DB de Schéma et de l'environnement d'exécution, vous pouvez modifier ce code pour modifier/remplacer le schéma, déclarations, etc pour correspondre à vos besoins (sans trop de maux de tête, de l'OMI.)

3voto

LeLong37 Points 1165

1 - Vous devez activer les migrations, prefereably avec EntityFramework 5. Utiliser Enable-Migrations dans le gestionnaire de package NuGet.

2 - Déplacez votre

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

pour vos semis de méthode dans votre YourMvcApp/Migrations/Configuration.cs de la classe

    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"});
    }

Maintenant EF5 sera en charge de la création de votre profil Utilisateur table, après cela, vous appelez le WebSecurity.InitializeDatabaseConnection pour enregistrer uniquement les SimpleMembershipProvider avec le déjà créé UserProfile table, aussi tellling SimpleMembershipProvider de la colonne qui est le nom d'utilisateur et nom d'utilisateur. Je suis également montrer un exemple de comment vous pouvez ajouter des Utilisateurs, des Rôles et d'associer les deux dans votre Graine méthode personnalisée de propriétés UserProfile/champs par exemple, un utilisateur Mobile (le numéro).

3 - Maintenant, lorsque vous exécutez la mise à jour de la base de données à partir de la Console du Gestionnaire de Package, EF5 allez configurer votre tableau avec tous vos propriétés personnalisées

Pour des références supplémentaires, veuillez vous référer à cet article avec le code source: http://blog.longle.net/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/

2voto

pranav rastogi Points 1426

Vous pouvez utiliser OAUth avec ASP.NET Universelle des Fournisseurs. universel fournisseurs de la nouvelle version de sqlmembership fournisseurs. elles sont basées sur des EF CodeFirst et aussi de générer un plus propre schéma de votre base de données regarde mon post suivant pour plus de détails http://blogs.msdn.com/b/pranav_rastogi/archive/2012/09/12/integrate-openauth-openid-with-your-existing-asp-net-application-using-universal-providers.aspx

2voto

Rohit Points 201

Cela peut ne pas fonctionner pour votre cas d'utilisation, mais bien sûr, vous pouvez très facilement ajouter vos attributs de l'utilisateur à l'Simplemembership UserProfile Table au lieu de créer un autre Utilisateur de la Table

Je recommande d'utiliser le tableau de l'appartenance à garder le hachage de mot de passe, et de simplement ignorer les champs que vous n'avez pas besoin. De cette façon, maintient la compatibilité avec SimpleMembership sans beaucoup de bruit.

SQLMembership est très facile de sortir de la boîte. J'ai fait de longues personnalisé extensions SQLMembership sur quelques projets, ce qui n'était pas difficile, mais en regardant en arrière, je souhaite que je n'avais pas. Il est une sorte de tâches de maintenance,

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X