37

我想启用 ASP.NET MVC 4 的 SimpleMembership API 以与我自己的数据库架构集成。我的数据库中有一个简单的表,Users用这些字段调用:

  • ID
  • 姓名
  • 密码
  • 电子邮件
  • 已删除

我已经配置了 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,包含很多我不需要的不必要信息。

此外,我还有其他自动创建的表,称为 pages_OAuthMembership、webpages_Roles 和 pages_UsersInRoles,我不需要这些表。

我已经尝试将表生成设置为 false:

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

但在这种情况下,CreateUserAndAccount 调用将引发异常,因为它不会找到 pages_Membership 表。

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

我的问题是:当我只想要一个简单的Users表格时,在这种情况下我应该怎么做?

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

4

7 回答 7

11

我向产品团队提出了同样的问题。

SIMPLE 成员的设计目标是尽可能简单地开箱即用。

因此,就表格而言,实际上不可能进行定制。推荐的解决方法是,仍然使用 ASP.NET Membership (SqlMembershipProvider)。

于 2012-09-11T07:04:36.967 回答
10

定制是可能的。

您可以从CodePlex 上的 aspnetwebstack 项目获取SimpleMembershipProvider的源代码,因为这是在 DB Schema 和运行时环境之间发生映射的地方,您可以修改此代码以修改/替换架构、语句等以满足您的需要(无需很头疼,IMO。)

于 2013-01-16T18:16:42.227 回答
3

1 - 您需要启用迁移,最好使用 EntityFramework 5.Enable-Migrations在 NuGet 包管理器中使用。

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 以仅将 SimpleMembershipProvider 注册到已创建的 UserProfile 表中,同时告诉 SimpleMembershipProvider 哪一列是 UserId 和 UserName。我还展示了一个示例,说明如何在 Seed 方法中添加用户、角色并将两者与自定义 UserProfile 属性/字段(例如用户的手机(号码))相关联。

3 - 现在,当您从包管理器控制台运行 update-database 时,EF5 将为您的表提供所有自定义属性

有关其他参考资料,请参阅本文的源代码: http ://blog.longle.io/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom -用户属性/

于 2012-09-25T01:09:43.987 回答
2

您可以将 OAUth 与 ASP.NET 通用提供程序一起使用。通用提供程序是新版本的 sqlmembership 提供程序。这些基于 EF CodeFirst,还可以生成更清晰的数据库架构,请查看我的以下帖子了解更多详细信息 http://blogs.msdn.com/b/pranav_rastogi/archive/2012/09/12/integrate-openauth- openid-with-your-existing-asp-net-application-using-universal-providers.aspx

于 2012-09-16T20:27:05.823 回答
2

这可能不适用于您的用例,但当然您可以非常轻松地将用户属性添加到 Simplemembership UserProfile 表,而不是创建另一个用户表

我建议使用现有的会员表来保留散列密码,而忽略不需要的字段。这样可以保持与 SimpleMembership 的兼容性,而不用大惊小怪。

SQLMembership 非常容易开箱即用。我已经在几个项目中对 SQLMembership 进行了广泛的自定义扩展,这并不难——但回想起来,我希望我没有。维修有点麻烦,

于 2013-07-16T19:08:05.757 回答
2

您可以通过扩展 MembershipProvider 创建自己的成员资格提供程序。有关详细信息,请参阅.NET 4.0 中的自定义 MembershipProvider 。使用这种方法,您只需要实现所需的方法。这应该有助于使事情变得更简单,并且不需要您添加不需要的表。

基本步骤(取自链接的 SO 答案)是:

  1. 创建一个新的 Class 文件(如果您不使用多层系统,请在项目的 Models 文件夹中)让我们将其命名为 MyMembershipProvider.cs
  2. 从 System.Web.Security.MembershipProvider 继承该类
  3. 自动创建所需的方法(继承类中的句点+空格)
于 2014-07-16T03:15:43.863 回答
0

您可以同时使用自定义用户表和 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);
}
于 2014-07-18T02:30:16.587 回答