asp.net-core - 带有 AppplicationDbContext 的身份脚手架

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

ASP.NET Core 2.x 现在隐藏了库中的标识页面和逻辑。为了延长IdentityUser具有新属性的实体并添加 UI 和逻辑来处理这些新属性,我们现在可以运行“身份脚手架”(在 MyProject -> Add -> New scaffolded item 下)。不幸的是,the docs充其量是不完整的,并且在很多情况下,完全错误。

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

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

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

    最佳答案

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

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

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

    新增 ApplicationUser继承自 IdentityUser 的类:
    public class ApplicationUser : IdentityUser
    {
        public string Nickname { get; set; }
    }
    

    添加新 ApplicationUser实体到 ApplicationDbContext类(class):
    public class ApplicationDbContext : IdentityDbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    
        public DbSet<ApplicationUser> AppUsers { get; set; }
    }
    

    替换 <IdentityUser> 的所有实例与 <ApplicationUser> .这意味着您将更改 startup.cs 以调用 services.AddDefaultIdentity<ApplicationUser>() ,您将替换对 SigninManager 的所有引用和 UserManager指定新 <ApplicationUser>类型参数。

    哇...现在,您可以进入诸如 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);
    

    关于asp.net-core - 带有 AppplicationDbContext 的身份脚手架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51351327/

    相关文章:

    asp.net-mvc-5 - 在 MVC5 中更新 Microsoft.Aspnet.Identity 后出现编译器错误

    C# mvc - 如何从通用方法返回特定 View

    asp.net-core - 在运行时更改注入(inject)的对象

    docker - 环境变量OpenShift .NET Core

    asp.net-core - 如何在EF Core 3.0中使用FromSqlInterpolated对多个参数执行存储过程?

    sql-server - MVC 5新项目标识表到sql server

    c# - 带有脚手架编辑 Controller 的新 ASP.net 核心项目只返回 404 页面未找到

    docker - dotnet restore 在本地工作但在构建 Docker 容器时失败

    c# - 如何从 SSL key 文件创建 RsaSecurityKey 实例

    c# - AspNetUsers 的主键不一致 "Object reference not set to an instance of an object"