Visual studio 如何在现有数据库中使用MVC5RC/RTW进行身份验证
我最初是在身份测试版时问这个问题的。从那时起,类和接口发生了很大的变化,RTW版本比RC版本有了一些修改。原则上,我需要实现以下目标Visual studio 如何在现有数据库中使用MVC5RC/RTW进行身份验证,visual-studio,forms-authentication,visual-studio-2013,asp.net-mvc-5,asp.net-identity,Visual Studio,Forms Authentication,Visual Studio 2013,Asp.net Mvc 5,Asp.net Identity,我最初是在身份测试版时问这个问题的。从那时起,类和接口发生了很大的变化,RTW版本比RC版本有了一些修改。原则上,我需要实现以下目标 根据我的usertable tblMembers验证本地登录,其中包含userid字段和密码,这是我需要验证的两项 可以通过Controller.User属性访问我的tblMember记录/类(在MVC5标识之前,我已经使用这些方法实现了这一点),无论用户是通过localuser方法还是通过其他OAuth提供商(Twitter、Google等)登录 能够显示我自
- 根据我的usertable tblMembers验证本地登录,其中包含userid字段和密码,这是我需要验证的两项
- 可以通过Controller.User属性访问我的tblMember记录/类(在MVC5标识之前,我已经使用这些方法实现了这一点),无论用户是通过localuser方法还是通过其他OAuth提供商(Twitter、Google等)登录
- 能够显示我自己的自定义用户名,而不必考虑登录方法。本地用户使用用户ID 1234567和密码登录,理想情况下,无论采用何种身份验证方法(本地/Twitter等),我都希望显示“John Smith(1234567)”
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 plus更好,您将看到 下表
public class ApplicationUser : IdentityUser
{
}
因此,您可以调用表tblMembers来代替ApplicationUser
public class tblMembers : IdentityUser
{
}
您的表tblMembers将继承Id用户名密码安全戳和一个表示这是TBLMember的鉴别器列
如果不创建用于身份验证的自定义类,最简单的方法就是将用户名设置为旧用户名和用户名的组合。然后将用户的真实姓名或旧用户名(不带用户id)存储在单独的列中
让用户使用内置用户登录进行注册,然后他们可以转到“管理帐户”并单击“使用其他服务”登录。这将把谷歌账户链接到他们的常规账户,所以无论他们使用哪一个,它都会让他们登录到同一个账户。如果您有具有连接表信息的用户,我建议您使用类似于模板中的register方法的所有用户为您的表设置种子。然后只需将新的组合用户名和Id与旧用户名和Id匹配,并在sql management studio中根据需要填充数据
同样,RC中的许多扩展标识用户的问题已经得到了解决。Microsoft已经在为identity user store添加更多功能,本教程将很快更新。我计划在完成数据库更改后进行自己的演练,但目前我希望我的建议比您可能希望实现的解决方案更简单。我开始认为(部分原因是缺乏这方面的信息),使用默认标识类可能更容易,但是要从AspNetUsers表为我自己的用户表提供引用完整性
如果我在AspNetUsers表中添加自定义链接字段,是否可以从Controllers.User属性访问我的表?i、 e.Controller.User.tblMember.Orders 您可以按照以下步骤修改IdentityModel.cs,轻松完成此操作: 在DbContext中重写OnModelCreating,然后添加以下内容,这会将AspNetUser表更改为“Users”,您还可以更改字段名称,默认Id列将变为User\u Id
modelBuilder.Entity<IdentityUser>()
.ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
modelBuilder.Entity()
.ToTable(“Users”,“dbo”).Property(p=>p.Id).HasColumnName(“User_Id”);
如果您想保留所有标准列名,也可以使用下面的选项:
modelBuilder.Entity<IdentityUser>()
.ToTable("Users", "dbo")
modelBuilder.Entity()
.ToTable(“用户”、“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");
}
}
公共类用户:IdentityUser
{
公共字符串PasswordOld{get;set;}
public DateTime DateCreated{get;set;}
公共bool已激活{get;set;}
公共bool用户角色{get;set;}
}
公共类ApplicationDbContext:IdentityDbContext
{
公共应用程序上下文()
:base(“默认连接”)
{
}
模型创建时受保护的覆盖无效(System.Data.Entity.DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity()
.ToTable(“Users”,“dbo”).Property(p=>p.Id).HasColumnName(“User_Id”);
modelBuilder.Entity()
.ToTable(“Users”,“dbo”).Property(p=>p.Id).HasColumnName(“User_Id”);
}
}
请注意,如果当前表存在,我还无法使其正常工作。
还请注意,将创建未映射的默认列
希望这能有所帮助。请阅读我上面的答案,我认为它会解决您的问题。也许我遗漏了一些东西,但为什么有两个modelBuilder实体映射?Tim,我不确定我的编码实践是否已经过时,但我仍然认为不应该为了注册/登录系统上的用户而将所有这些额外的表添加到现有数据库中。当我们有现有的数据库时,为什么微软强迫我们使用“代码优先”??有人说要用aspnet_users表创建一个引用完整性。认真地我开始觉得自己像个猛犸象,因为我不明白为什么微软假装MVC只用于全新的应用程序。@渴望了解,我在尝试让新的身份系统与现有数据库一起工作时遇到了问题第一个edmx生成的模型。似乎对整个身份识别系统的了解很少,架构一直在发生根本性的变化。我的许多朋友