ASP.NET MVC 4中使用自定义数据库架构的SimpleMembership

37

我希望能够使用 ASP.NET MVC 4 的SimpleMembership API来与我的数据库模式进行整合。 我的数据库中有一张名为 Users 的简单表格,其中包含以下字段:

  • Id
  • Name
  • Password
  • Email
  • IsDeleted

我已经配置了SimpleMembership API以使用我的数据库:

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

而且我也可以插入一个用户:

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
                                 new 
                                 { 
                                        IsDeleted = false, 
                                        Email = "sampledata@gmail.com"                
                                 });
然而,密码字段(或其哈希值)并没有插入到用户表中(当然),它被插入到另一个名为webpages_Membership的表中,该表是通过调用InitializeDatabaseConnection创建的,并且包含了很多我不需要的不必要的信息。
此外,我还有其他自动生成的表,例如webpages_OAuthMembership、webpages_Roles和webpages_UsersInRoles,但我不需要它们。
我已经尝试将表生成设置为false:
WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: false);

但是在这种情况下,CreateUserAndAccount调用会抛出异常,因为它找不到webpages_Membership表。

看起来我想要使用SimpleMembership API时需要这些表。

我的问题是:在这种情况下,当我只想要一个简单的Users表而不需要其他任何东西时,我该怎么办?

我是否需要自己编写整个成员资格处理和身份验证逻辑(哈希代码生成等)?

7个回答

11
我向产品团队提出了同样的问题。
SIMPLE会员的设计目标是尽可能简单地开箱即用。
因此,就表格而言,实际上没有定制的可能性。 推荐的解决方法是仍然使用ASP.NET Membership(SqlMembershipProvider)。

35
不!请不要这样做! :-) - Max
嗯...我搜索了“OAuth”,并且喜欢这种登录概念。我能否将新的OAuth支持与SqlMembershipProvider一起使用? - Zsolt
7
你可以使用 EF 获取额外的用户数据,这不会有任何阻碍。原文链接:http://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal-providers-and-the-new-asp-net-4-5-web-forms-and-asp-net-mvc-4-templates.aspx - James Fleming
1
我来到这里发布与James相同的链接,这个链接或多或少地否定了Simple Membership的意图是要在开箱即用时变得简单的想法 - 原始成员资格提供程序已经做得很好了。 新提供程序的设计,至少据称,更容易进行扩展。 - Adam Tolley
1
这个答案是误导性的。可以拥抱和扩展现有系统。如果开箱即用体验没有提供您同意的模式,您可以轻松地实现自己的SimpleMembershipProvider来创建和利用自己设计的模式。 - Shaun Wilson
显示剩余3条评论

10

定制化是可能的。

你可以从 CodePlex上的aspnetwebstack项目 获取SimpleMembershipProvider的源代码,因为这里是数据库模式和运行时环境之间映射发生的地方,你可以修改这个代码来修改/替换模式、语句等以满足你的需求(在我看来不会有太多麻烦)。


3

1 - 你需要启用迁移,最好使用EntityFramework 5,可以在NuGet包管理器中使用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将负责创建您的UserProfile表,完成后,您将调用WebSecurity.InitializeDatabaseConnection仅向已创建的UserProfile表注册SimpleMembershipProvider,还告诉SimpleMembershipProvider哪个列是UserId和UserName。我还展示了一个示例,说明如何在Seed方法中添加用户、角色并关联两者,同时包括自定义UserProfile属性/字段,例如用户的手机号码。
3-现在当您从Package Manager Console运行update-database时,EF5将使用所有自定义属性来提供您的表格。
有关其他参考,请参阅此带有源代码的文章: http://blog.longle.io/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/

2
我认为这篇博客文章是关于另一个主题的:使用EF Code Migrations种子数据。 我知道我可以向我的用户表添加任何属性(例如Mobile字符串),但我的问题不在于此,而在于重写/自定义自动生成的SimpleMembership表的整个模式。 - Zsolt

2
这可能并不适用于您的使用情况,但是您可以非常容易地将用户属性添加到Simplemembership UserProfile表中,而不是创建另一个用户表。我建议使用现有的成员资格表来保留散列密码,并忽略您不需要的字段。这样可以在不引起太多麻烦的情况下与SimpleMembership保持兼容性。SQLMembership开箱即用非常容易。我已经在几个项目上进行了广泛的自定义扩展,这并不困难,但回想起来,我希望我没有这样做。它有点麻烦维护。

2

通用提供程序与SimpleMembership不兼容,这并没有解决OP的问题。 - Shaun Wilson

2
您可以通过扩展MembershipProvider来创建自己的成员资格提供程序。有关更多详细信息,请参见.NET 4.0中的Custom MembershipProvider (自定义MembershipProvider)。使用此方法,您只需要实现所需的方法即可。这应该有助于保持事情更简单,而不需要添加您不需要的表。
基本步骤(从链接的SO答案中获取)如下:
  1. 创建一个新的Class文件(如果您没有使用多层系统,则在项目的Models文件夹中),我们称其为MyMembershipProvider.cs
  2. 从System.Web.Security.MembershipProvider继承该类
  3. 自动创建所需的方法(在继承类中加入周期和空格)

0

你可以同时使用自定义的Users表和SimpleMembership表。这种方法在过去对我非常有效。

例如,在AccountController的Register方法中,你可以通过将用户添加到自己的Users表来注册新用户。然后使用你在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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接