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



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

  • 根据我的用户表 tblMembers 验证本地登录,其中包含用户 id 字段和密码,这是我需要身份验证的两个项目。
  • 可以通过 Controller.User 属性访问我的 tblMember 记录/类(在 MVC5 身份之前,我使用成员资格提供程序方法实现了这一点),无论用户是通过 localUser 方法还是通过其他 OAuth 提供程序之一(Twitter、Google 等)登录
  • 尽管登录方法,仍能够显示我自己的自定义用户名。本地用户使用用户ID 1234567和密码登录,理想情况下,无论身份验证方法(本地/Twitter等)如何,我都希望显示" John Smith (1234567)"

最初我不确定我的成员类应该从它从我应该使用 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 标识系统集成的示例?

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

  public class ApplicationUser : IdentityUser
  {

   }

因此,您可以调用表tblMembers而不是应用程序用户

  public class tblMembers : IdentityUser
  {

   }

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

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

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

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

您可以通过修改 IdentityModel 轻松完成此操作.cs如下所示:

覆盖 OnModelCreate 在 DbContext 中,然后添加以下内容,这会将 AspNetUser 表更改为"用户",您还可以更改默认 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");
        }
    }

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

希望有帮助。

我开始认为(部分原因是缺乏这方面的信息),使用默认身份类可能更容易,但要从 AspNetUsers 表中为我自己的用户表提供引用完整性。

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

相关内容

  • 没有找到相关文章

最新更新