我最初在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?