C# 在现有数据库中实现ASP.NET标识
我有一个现有的项目和SQL数据库,其中包含一个Users表(我们称之为“MyOldUsersTable”)和带有PK-FK关系的附加表(地址、电话、位置等) NB:此数据库不使用成员身份或身份。它是从另一个项目提取的数据库,“MyOldUsersTable”不包含任何登录信息(密码、上次登录等)。 我开始使用一个带有标识的Web Api项目,但它会生成默认表(AspNetUsers、AspNetUserRoles、AspNetUserLogins…) 目标:获取ASP.NET标识以使用现有表 我尝试了这个解决方案: 但是Identity将“MyOldUsersTable”重命名为“MyOldUsersTable1”,并将“AspNetUsers”表重命名为“MyOldUsersTable”。这不是很有用 最好的方法是什么?我有三种选择:C# 在现有数据库中实现ASP.NET标识,c#,entity-framework,asp.net-web-api2,asp.net-identity,C#,Entity Framework,Asp.net Web Api2,Asp.net Identity,我有一个现有的项目和SQL数据库,其中包含一个Users表(我们称之为“MyOldUsersTable”)和带有PK-FK关系的附加表(地址、电话、位置等) NB:此数据库不使用成员身份或身份。它是从另一个项目提取的数据库,“MyOldUsersTable”不包含任何登录信息(密码、上次登录等)。 我开始使用一个带有标识的Web Api项目,但它会生成默认表(AspNetUsers、AspNetUserRoles、AspNetUserLogins…) 目标:获取ASP.NET标识以使用现有表 我
解决方案2:保留这两个系统,只需在“AspNetUsers”和“MyOldUsersTable”之间添加一个PK-FK即可。可能,但字段(电子邮件、电话)中可能存在重复项。同时维护两个用户表也不理想 当在表之间添加一对零对一关系时,它会起作用,如下所示:
modelBuilder.Entity<MyOldUsersTable>()
.HasOptional(e => e.ApplicationUser)
.WithRequired(e => e.MyOldUsersTable)
.Map(m => m.MapKey("MyOldUsersTableId"))
.WillCascadeOnDelete(false);
然后将默认用户存储替换为自定义用户存储:
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
var-manager=newapplicationUserManager(newuserstore(context.Get());
替换为:
var manager = new ApplicationUserManager(new CustomUserStore(context.Get<ApplicationDbContext>()));
var-manager=newapplicationusermanager(newcustomuserstore(context.Get());
最后,CustomUserStore使用所需的接口实现。例如,密码、电子邮件和安全戳:
public class CustomUserStore : IUserStore<MyOldUsersTable, int>, IUserPasswordStore<MyOldUsersTable, int>, IUserEmailStore<MyOldUsersTable, int>, IUserSecurityStampStore<MyOldUsersTable, int>
公共类CustomUserStore:IUserStore、IUserPasswordStore、IUserEmailStore、IUserSecurityStampStore
那么……密码和其他数据在哪里?部署“AspNetUsers”表并迁移数据,让所有用户重置密码,听起来您的场景会更好。第一个系统没有任何登录/密码。它只是输入到系统中。但是“MyOldUsersTable”中的记录“现在已转换为真实账户。问题是,“MyOldUsersTable”不是唯一的表。它与其他表有许多依赖关系PK/FK。因此,如果我使用“AspNetUsers”,我将不得不重新创建所有10+表约束。最重要的是,“AspNetUsers”(nvarchar)和“MyOldUsersTable”(int)的PKs是不同的。只需在“AspNetUsers”和“MyOldUsersTable”之间添加新的交叉表即可。您必须获取属于具体用户的登录名
var manager = new ApplicationUserManager(new CustomUserStore(context.Get<ApplicationDbContext>()));
public class CustomUserStore : IUserStore<MyOldUsersTable, int>, IUserPasswordStore<MyOldUsersTable, int>, IUserEmailStore<MyOldUsersTable, int>, IUserSecurityStampStore<MyOldUsersTable, int>