【问题标题】:Identity scaffolding with AppplicationDbContext带有 AppplicationDbContext 的身份脚手架
【发布时间】:2020-01-19 21:44:27
【问题描述】:

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

我正在努力弄清楚如何使用脚手架和生成的代码来实现我认为是一个非常标准的用例:

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

我的问题是,阅读文档和使用 Identity 脚手架时,我无法弄清楚如何让脚手架让我扩展 IdentityUser 继续使用现有的 @987654327 @。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    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; }
    }
    

    &lt;IdentityUser&gt; 的所有实例替换为&lt;ApplicationUser&gt;。这意味着您将更改 startup.cs 以调用 services.AddDefaultIdentity&lt;ApplicationUser&gt;(),并将替换所有对 SigninManagerUserManager 的引用以指定新的 &lt;ApplicationUser&gt; 类型参数。

    哇...现在,您可以进入 Register.cshtml.cs 之类的内容并创建(或获取)新的 ApplicationUser 而不是 IdentityUser,所有管道都将连接到 @987654341 @。例如,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);
    

    【讨论】:

      【解决方案2】:

      通常,没有身份,ApplicationDbContext 继承自 DbContext

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

      我有一个位于DATAApplicationDbContext,并已将其修改为从IdentityDbContext 继承,例如:

      public class ApplicationDbContext : IdentityDbContext&lt;IdentityUser&gt;

      现在,ENTITIES 是定义模型 (POCO) 的位置。

      并且,DATA 中的 AppliationDbContext 包含对这些类的引用,并包含 EF 使用的 DbSet&lt;T&gt; 属性设置器。 ENTITIES 中的 Person(aka, ApplicationUser) 类如下所示:

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

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

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

      似乎只使用一个DbContext 服务就可以解决问题。它还扩展了AspNetUsers 表以包含我在位于ENTITIES 内的POCO Person 模型类中设置的[PersonalData] 属性。

      现在,因为 &lt;IdentityUser&gt; 已扩展,在我的例子中是 Person,所有对 IdentityUser 的引用都应该更新以反映这一点。所以Startup.ConfigureServices 现在看起来像这样:

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

      并且,在 UI 中,要访问由“Person”添加的属性,~/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 项。

      【讨论】:

      • 伙计,这是一个精心设计的详细答案。不幸的是,除非我遗漏了什么,否则这不是我想问的问题的答案。我将更新问题以澄清我正在专门询问 ASP.NET Core Identity 脚手架,以及我在仍然使用现有的 ApplicationDbContext 的同时难以弄清楚如何搭建 Identity 页面。
      【解决方案3】:

      尝试右键单击解决方案,但无法选择 ApplicationDbContext。我必须将 Visual Studio 更新到最新版本并安装所有最新的 SDK(.Net Core 3.1)。在那之后,这一切都像一个魅力。希望它可以帮助某人。

      【讨论】:

        猜你喜欢
        • 2022-01-23
        • 1970-01-01
        • 2023-01-04
        • 2021-06-21
        • 2020-04-12
        • 1970-01-01
        • 2021-10-02
        • 2020-11-23
        • 1970-01-01
        相关资源
        最近更新 更多