带有AppplicationDbContext的身份棚架

Bob*_*lth 2 asp.net-identity .net-core asp.net-core

现在,ASP.NET Core 2.x将标识页面和逻辑隐藏在库中。为了IdentityUser使用新属性扩展实体并添加UI和逻辑以处理这些新属性,我们现在运行“ Identity scaffolder”(在MyProject-> Add-> New scaffolded项下)。不幸的是,这些文档充其量是不完整的,在很多情况下,它们完全是错误的。

我正在努力弄清楚如何对脚手架和最终代码进行搏斗,以实现我认为是相当标准的用例:

  1. 我从一个新的ASP.NET Core MVC应用开始
  2. 我想扩展IdentityUser自己的属性。由于这涉及创建继承的类,因此我希望该新类的名称为ApplicationUser
  3. 我想搭建我需要摆弄的“身份”页面(登录,注册,管理等)
  4. 我想使用现有的 ApplicationDbContext

我的问题是,阅读文档并使用Identity脚手架时,我不知道如何获得该脚手架以让我扩展IdentityUser 继续使用现有的ApplicationDbContext

Bob*_*lth 5

在盯着文档并使用了脚手架和生成的代码之后,我想我已经弄清楚了大部分内容。

  1. 从带有“个人用户帐户”身份验证的新ASP.NET Core Web应用程序开始。显然,是从“ Web应用程序”(即Razor页面)还是“ Web应用程序(模型-视图-控制器)”(即MVC)开始都没有关系。最后,“身份”页面将是“剃刀页面”,但它们在MVC应用程序中的功能还不错。
  2. 构建解决方案。我不确定这是否有必要,但这并没有伤害...
  3. 在继续之前,请确保您喜欢数据库连接字符串(在appsettings.json中)。在软件包管理器控制台中,输入命令update-database。显然,这将更新ApplicationDbContextModelSnapshot.cs文件,以包括从项目模板获得的初始迁移。如果您跳过此步骤,则在添加首次迁移时,它将包括00000000000000_CreateIdentitySchema.cs中已经包含的所有迁移步骤。同样,显然需要该步骤以使脚手架识别现有的ApplicationDbContext
  4. 右键单击该项目,然后选择添加->新脚手架;选择身份项目类型
  5. 指定您现有的_Layout.cshtml并选择您要构建的页面
  6. 在“数据”上下文类旁边,单击下拉箭头,然后选择现有的 ApplicationDbContext
  7. 单击添加按钮执行脚手架。

此时,您的项目已连接到现有项目ApplicationDbContextIdentityUser类。现在,您可以扩展IdentityUser并连接“身份”页面以使用新的扩展实体:

添加一个ApplicationUser继承自的新类IdentityUser

public class ApplicationUser : IdentityUser
{
    public string Nickname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

将新ApplicationUser实体添加到ApplicationDbContext类中:

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    public DbSet<ApplicationUser> AppUsers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

替换的所有实例<IdentityUser><ApplicationUser>。这意味着您将把startup.cs更改为call services.AddDefaultIdentity<ApplicationUser>(),并将替换所有引用,SigninManagerUserManager指定新的<ApplicationUser>Type参数。

......现在,您可以进入Register.cshtml.cs之类的内容并创建(或获取)一个新的ApplicationUser而不是an IdentityUser,并且所有管道都将连接到ApplicationUser。例如,Register.cshtml.cs中的代码可能如下所示:

var user = new ApplicationUser {
    UserName = Input.Email,
    Email = Input.Email,
    Nickname = Input.Nickname // New property
};
var result = await _userManager.CreateAsync(user, Input.Password);
Run Code Online (Sandbox Code Playgroud)