在ASP.NET MVC 4中使用自定义数据库模式的SimpleMembership
我想启用ASP.NET MVC 4的SimpleMembership API来与我自己的数据库模式集成。 我在我的数据库中有一个普通而简单的表,名为Users
,这些字段是:
- ID
- 名称
- 密码
- 电子邮件
- 请将isDeleted
我已经configuration了SimpleMembership API来使用我的数据库:
WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: true);
我也可以插入一个用户:
WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { IsDeleted = false, Email = "sampledata@gmail.com" });
然而,密码字段(或它的散列)没有插入Users表(当然),它插入到另一个名为webpages_Membership
表中,该表使用InitializeDatabaseConnection
调用创build,并包含大量不需要的信息。
此外,我有其他自动创build的表,称为webpages_OAuthMembership,webpages_Roles和webpages_UsersInRoles我不需要。
我已经尝试将表生成设置为false:
WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: false);
但在这种情况下,CreateUserAndAccount调用将抛出一个exception,因为它不会findwebpages_Membership表。
它看起来像我想要使用SimpleMembership API时所需的这些表。
我的问题是:当我只想要一个简单的Users
表,而不需要什么时,我应该怎么做呢?
我必须自己编写整个成员资格处理和authentication逻辑(散列码生成等)吗?
我向产品团队提出了同样的问题。
SIMPLE成员的devise目标是尽可能简单地开箱即用。
所以,就表格而言,真的没有可能的定制。 推荐的解决方法是,仍然使用ASP.NET Membership(SqlMembershipProvider)。
定制是可能的。
您可以从CodePlex上的aspnetwebstack项目获取SimpleMembershipProvider的源代码,因为这是在DB Schema和运行时环境之间进行映射的地方,您可以修改此代码以修改/replace模式,语句等以满足您的需求很头痛,IMO。)
1 – 您需要启用迁移,优先使用EntityFramework 5.在NuGet包pipe理器中使用Enable-Migrations
。
2 – 移动你的
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true);
到YourMvcApp / Migrations / Configuration.cs类中的Seed方法
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"}); }
现在EF5将负责创build你的UserProfile表,在这之后,你将调用WebSecurity.InitializeDatabaseConnection来仅注册SimpleMembershipProvider与已经创build的UserProfile表,同时还提供了SimpleMembershipProvider的哪个列是UserId和UserName。 我还展示了一个如何添加用户,angular色并将你的Seed方法中的两个与自定义UserProfile属性/字段(例如用户的移动(号码))关联的例子。
3 – 现在,当您从软件包pipe理器控制台运行update-database时,EF5将为您的表提供所有自定义属性
有关其他参考资料,请参阅本文的源代码: http : //blog.longle.io/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom -user的属性/
您可以在ASP.NET Universal Providers上使用OAUth。 通用提供者是sqlmembership提供者的新版本。 这些基于EF CodeFirst,也生成一个更清洁的数据库模式看看我的后续文章更多详细信息http://blogs.msdn.com/b/pranav_rastogi/archive/2012/09/12/integrate-openauth- OpenID的使用,您的现有-ASP-使用networking应用程序,万能,providers.aspx
这可能不适用于您的用例,但是当然您可以非常方便地将您的用户属性添加到Simplemembership UserProfile表,而不是创build另一个用户表
我build议使用现有的会员表来保持散列密码,并忽略不需要的字段。 这种方式保持与SimpleMembership的兼容性没有太多的大惊小怪。
SQLMembership是非常容易的开箱即用。 我在几个项目上做了大量的SQLMembership扩展,这并不难 – 但是回头看,我希望没有。 这是一种维修麻烦,
您可以通过扩展MembershipProvider来创build自己的成员资格提供程序。 请参阅.NET 4.0中的自定义MembershipProvider以获取更多详细信息。 使用这种方法,你只需要实现你需要的方法。 这应该有助于使事情更简单,不需要添加不需要的表。
基本步骤(从链接的SO回答中获得)是:
- 创build一个新的Class文件(如果您没有使用多层系统,在您的项目的Models文件夹中),我们称之为MyMembershipProvider.cs
- 从System.Web.Security.MembershipProviderinheritance该类
- 自动创build所需的方法(inheritance类中的句号+空格)
您可以使用您的自定义Users表和SimpleMembership表。 这个方法过去对我很好。
例如,在AccountController的Register方法中,通过将用户添加到您自己的Users表中来注册一个新用户。 然后使用添加到用户表中的用户的ID将此用户添加到SimpleMembership UserProfile表中。
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); }