如何使用MVC5RC / RTW与现有数据库进行身份验证

时间:2013-10-14 08:13:14

标签: visual-studio forms-authentication visual-studio-2013 asp.net-mvc-5 asp.net-identity

我最初在身份处于测试版时询问question。从那时起,类和接口发生了很大的变化,RTW版本再次对RC版本进行了一些修改。appears原则上我需要实现以下目标。

  • 根据我的usertable tblMembers验证本地登录,其中包含userid字段和密码,这是我需要进行身份验证的两个项目。
  • 可以通过Controller.User属性访问我的tblMember记录/类(在MVC5身份之前我使用membership provider方法实现了这一点。)无论用户是通过localuser方法还是通过一个方法登录其他OAuth提供商(Twitter,Google等)。
  • 尽管使用登录方法,但仍能显示我自己的自定义用户名。本地用户使用用户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 Identity系统集成?

3 个答案:

答案 0 :(得分:4)

我还将身份表添加到我的数据库中。如果你在visual studio 2013中创建一个新的web项目,你会发现现在在RTM中一切都比RC更好,你会看到  下表

  public class ApplicationUser : IdentityUser
  {


   }

因此,您可以调用您的表tblMembers

而不是ApplicationUser
  public class tblMembers : IdentityUser
  {


   }

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

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

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

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

答案 1 :(得分: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");
        }
    }

请注意,如果当前表存在,我无法使其正常工作。 另请注意,如果您没有映射任何列,则会创建默认列。

希望有所帮助。

答案 2 :(得分:0)

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

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