带有AppplicationDbContext的身份棚架

时间:2018-07-15 19:03:13

标签: asp.net-core .net-core asp.net-identity

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

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

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

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

2 个答案:

答案 0 :(得分:3)

盯着the docs并使用脚手架和生成的代码后,我想我已经弄明白了。

  1. 从新的ASP.NET Core Web应用程序开始,该应用程序具有“个人用户帐户”身份验证。显然,是以“ Web应用程序”(即Razor Pages)还是“ Web应用程序(模型-视图-控制器)”(即MVC)开头并不重要。最后,“身份”页面将是“剃刀页面”,但它们在MVC应用程序中可以正常工作。
  2. 构建解决方案。我不确定这是否有必要,但这并没有伤害...
  3. 进一步操作之前,请确保您喜欢数据库连接字符串(位于appsettings.json中)。在Package Manager控制台中,输入命令 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; }
}

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

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

    public DbSet<ApplicationUser> AppUsers { get; set; }
}

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

为什么...现在,您可以进入Register.cshtml.cs之类的内容,并创建(或获取)新的ApplicationUser而不是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);

答案 1 :(得分:0)

通常,ApplicationDbContext在没有身份的情况下继承自DbContext

我有四个项目的解决方案。 WEBWebAPIDATAENTITIES

我在ApplicationDbContext中有一个DATA,并对其进行了修改以继承自IdentityDbContext,例如:

public class ApplicationDbContext : IdentityDbContext<IdentityUser>

现在,ENTITIES是定义模型(POCO)的地方。

并且,AppliationDbContext中的DATA包含对这些类的引用,并包含EF使用的DbSet<T>属性设置器。 Person中的ApplicationUser(又名ENTITIES)类如下:

public class Person : IdentityUser { [PersonalData] public string LastName { get; set; }

WEB项目中,有对DATAApplicationDContext的适当引用,我只有一个services.AddDbContext<T>依赖项引用;然后在AddDefaultIdentity<IdentityUser>()服务添加中使用该上下文。

         services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

        services.AddDefaultIdentity<IdentityUser>()
            .AddEntityFrameworkStores<ApplicationDbContext>();

似乎只使用一项DbContext服务就可以了。它还扩展了AspNetUsers表,以包括我在[PersonalData]内的POCO Person模型类中设置的ENTITIES属性。

现在,因为 <IdentityUser>已扩展,以我为例,Person已扩展了对IdentityUser的所有引用以反映这一点。因此Startup.ConfigureServices现在看起来像这样:

            services.AddDefaultIdentity<Person>()
            .AddEntityFrameworkStores<ApplicationDbContext>();

而且,在用户界面内,要访问“人物”添加的属性,~/Identity/Account/Manage/Index.cshtml.cs中的引用也需要更新:

        private readonly UserManager<Person> _userManager;
    private readonly SignInManager<Person> _signInManager;
    private readonly IEmailSender _emailSender;

    public IndexModel(
        UserManager<Person> userManager,
        SignInManager<Person> signInManager,
        IEmailSender emailSender)
    {
        _userManager = userManager;
        _signInManager = signInManager;
        _emailSender = emailSender;
    }

您将必须更新index.cshtml.cs中的'InputModel'和OnGetAsync()方法中的'new up'来映射属性-与Email的处理方式类似默认设置。

最后,有一个index.cshtml视图文件可以访问UI /剃须刀显示。

这应该可以让您带着问题中的第1-4条进入您的行列。