在现有数据库中实现ASP.NET标识

时间:2018-07-05 04:32:22

标签: c# entity-framework asp.net-web-api2 asp.net-identity

我有一个现有的项目和SQL数据库,其中包含一个Users表(我们称其为“ MyOldUsersTable”)和具有PK-FK关系的附加表(地址,电话,位置等)。

注意:此数据库不使用成员资格或身份。它是从另一个项目中提取的数据库,“ MyOldUsersTable”不包含任何登录信息(密码,上次登录等)

我首先使用具有身份的Web Api项目,但是它会生成默认表(AspNetUsers,AspNetUserRoles,AspNetUserLogins ...)

目标:获取ASP.NET身份以使用现有表

我尝试了以下解决方案: How can I change the table names when using Visual Studio 2013 ASP.NET Identity? 但是Identity将“ MyOldUsersTable”重命名为“ MyOldUsersTable1”,并将“ AspNetUsers”表重命名为“ MyOldUsersTable”。那不是很有用。

最佳方法是什么?我看到三个选项:

  1. 解决方案1:将“ MyOldUsersTable”表字段移至“ ASPNETUser”表,并与其他表一起更改PK-FK
  2. 解决方案2:让Identity了解用户表现在是“ MyOldUsersTable”
  3. 解决方案3:保留两个系统,仅在“ AspNetUsers”和“ MyOldUsersTable”之间添加PK-FK

1 个答案:

答案 0 :(得分:1)

解决方案2:保留两个系统,仅在“ AspNetUsers”和“ MyOldUsersTable”之间添加PK-FK 。可能,但是字段(电子邮件,电话)中可能有重复项。另外,要维护两个用户表也不理想。

在像这样的表之间添加“一对零”到“一对一”关系时,它起作用:

        modelBuilder.Entity<MyOldUsersTable>()
            .HasOptional(e => e.ApplicationUser)
            .WithRequired(e => e.MyOldUsersTable)
            .Map(m => m.MapKey("MyOldUsersTableId"))
            .WillCascadeOnDelete(false);

最佳:解决方案3.通过删除所有来自IdentityUser的默认行为,使Identity了解现在的用户表为“ MyOldUsersTable”。

第一步是通过替换来删除对IdentityDbContext的引用:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

作者:

public class ApplicationDbContext : DbContext 

然后将默认的UserStore替换为自定义的UserStore:

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));

替换为:

var manager = new ApplicationUserManager(new CustomUserStore(context.Get<ApplicationDbContext>()));

最后,使用所需的接口实现CustomUserStore。例如密码,电子邮件和安全标记:

public class CustomUserStore : IUserStore<MyOldUsersTable, int>, IUserPasswordStore<MyOldUsersTable, int>, IUserEmailStore<MyOldUsersTable, int>,  IUserSecurityStampStore<MyOldUsersTable, int>