5

我最初在 Identity 处于测试阶段时问了这个问题。从那时起,类和接口发生了很大变化,看起来RTW 版本比 RC 版本再次进行了一些修改。原则上我需要实现以下目标。

  • 针对我的用户表 tblMembers 验证本地登录,其中包含用户 ID 字段和密码,这是我需要验证的两项。
  • 可以通过 Controller.User 属性访问我的 tblMember 记录/类(在 MVC5 身份之前,我已经使用成员资格提供程序方法实现了这一点。)无论用户是通过 localuser 方法还是通过其他 OAuth 提供程序之一登录(推特、谷歌等)。
  • 尽管有登录方法,但能够显示我自己的自定义用户名。本地用户使用用户 ID 1234567 和密码登录,理想情况下我想显示“John Smith (1234567)”,无论身份验证方法如何(本地/Twitter 等)

最初我不确定我的成员类应该继承什么从我应该使用 IdentityUser 的 aspIdentitySample 项目中出现?

        public partial class tblMember
        {
            public int id { get; set; }
            public string membership_id { get; set; }
            public string password { get; set; }
            ....other fields
        }

是否有任何将现有数据库/用户表与 ASP.NET 身份系统集成的新示例或更新示例?

4

3 回答 3

4

我还将身份表添加到我的数据库中。如果您在 Visual Studio 2013 中创建一个新的 Web 项目,您将看到现在在 RTM 中一切都比 RC 更好,您将看到下表

  public class ApplicationUser : IdentityUser
  {


   }

所以代替 ApplicationUser 你可以调用你的表 tblMembers

  public class tblMembers : IdentityUser
  {


   }

您的表 tblMembers 将继承 Id 用户名密码安全标记和一个鉴别器列,说明这是一个 tblMemeber

如果不为身份验证创建自定义类,最简单的方法就是将用户名设置为旧用户名和用户 ID 的组合。然后将没有用户 ID 的用户真实姓名或旧用户名存储在单独的列中。

让用户使用内置用户登录进行注册,他们可以转到管理帐户并单击使用其他服务登录。这会将谷歌帐户链接到他们的常规帐户,因此无论他们使用哪个帐户都会登录到同一个帐户。如果您的用户具有连接的表信息,我建议您使用与模板中的 register 方法类似的方法为所有用户播种表。然后将新的组合用户名和 Id 与旧的匹配,并在需要的地方填充数据sql管理工作室。

RC 中扩展 IdentityUsers 的许多问题再次得到修复。Microsoft 已经在身份用户存储中添加了更多功能,本教程http://www.windowsazure.com/en-us/develop/net/tutorials/web-site-with-sql-database/应该很快会更新. 我计划在完成更改数据库后自行完成,但现在我希望我的建议,即使它们是一个比您可能想要实现的更简单的解决方案。

于 2013-10-20T21:10:43.437 回答
1

您可以通过修改 IdentityModel.cs 来轻松做到这一点,如下所示:

在 DbContext 中覆盖 OnModelCreating,然后添加以下内容,这会将 AspNetUser 表更改为“Users”,您还可以更改字段名称,默认 Id 列将变为 User_Id。

modelBuilder.Entity<IdentityUser>()
                    .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");

或者如果您想保留所有标准列名,则只需以下内容:

modelBuilder.Entity<IdentityUser>()
                        .ToTable("Users", "dbo")

下面的完整示例(这应该在您的 IdentityModel.cs 文件中)我将 ApplicationUser 类更改为 User。

public class User : IdentityUser
    {
        public string PasswordOld { get; set; }
        public DateTime DateCreated { get; set; }

        public bool Activated { get; set; }

        public bool UserRole { get; set; }

    }

public class ApplicationDbContext : IdentityDbContext<User>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
            modelBuilder.Entity<User>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
        }
    }

请注意,如果当前表存在,我还没有设法让它工作。另请注意,您未映射的任何列都将创建默认列。

希望有帮助。

于 2013-10-24T14:57:43.103 回答
0

我开始认为(部分是由于该领域缺乏信息),使用默认身份类可能更容易,但从AspNetUsers表中为我自己的用户表提供参照完整性。

如果我将自定义链接字段添加到 AspNetUsers 表中,是否可以从 Controllers.User 属性访问我的表?即Controller.User.tblMember.Orders?

于 2013-10-24T06:59:33.797 回答