如何从 ASP.NET Identity Core 2.0 中删除与角色相关的表

How to remove the role-related tables from ASP.NET Identity Core 2.0

根据其他地方的建议,角色是声明的子集,我正在寻找一种干净的方法来询问 ASP.NET 身份中的 EF Core 实现不要在 ASP.NET VS 2017 中的 Identity Core 2.0 模板。只需要声明。 该模板使用

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

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        // Customize the ASP.NET Identity model and override the defaults if needed.
        // For example, you can rename the ASP.NET Identity table names and more.
        // Add your customizations after calling base.OnModelCreating(builder);
    }
}

并且 IdentityDbContext 创建了这些角色相关的表

https://github.com/aspnet/Identity/blob/dev/src/Microsoft.AspNetCore.Identity.EntityFrameworkCore/IdentityDbContext.cs

如何在不操作迁移文件的情况下摆脱它们?

你不能,如果你这样做,Identity 很可能会停止运作。不管喜欢与否,身份利用角色。您可以选择不使用此功能,但它仍然存在。

也就是说,从某种意义上说,每个身份验证工件都是一个 "claim"。然而,声明是抽象的概念,而像角色这样的东西有具体的实现。如果您需要授权过滤器,那么您应该使用角色。您可以使用声明,但无论如何您只需要重新实现角色的概念。不要重新发明轮子。

这在 ASP.NET Identity 中一直是可能的,但随着时间的推移变得更容易,因为约定已经从 Roles 转向 Rights、Actions、Claims、Predicates 和其他更可重用和可维护的语义。多年来,我一直在我的 ASP.NET 项目中使用 Identity 和我预先存在的数据库模式(没有角色表)。我承认,由于 ASP.NET Identity 的繁琐复杂性,以及 ASP.NET 中发生的快节奏开源代码更改以及完全缺乏API 参考中的人工文档(完全是机器生成的样板文件)。

在 ASP.NET Core 之前,您可以通过覆盖 UserManagerUserStore 实现来实现。通过使用无操作删除 Role 请求,或用更有用且对开发人员安全的实现覆盖 RoleAttribute 实现(可能不是基于魔术字符串!),Role 表的缺失不会引起注意。即使使用默认实现,如果您从未使用过默认 Role 属性实现或询问 Role 问题,则可以删除这些表而不会产生任何后果。默认 ASP.NET 脚手架的 None 取决于角色。

在最初的 ASP.NET Core Identity 1.0/1.1 版本中,您通过实现 UserStore 而没有可选的 IUserRoleStore 接口来实现这一点。相关信息可在 main ASP.NET Core Identity documentation.

中找到

从 ASP.NET Core 2.0 开始(根据您的主要问题),您可以通过从 IdentityUserContext 而不是 IdentityDbContext 派生上下文来更轻松地做到这一点,如下例所示.由于 the new UserOnlyStore. The call to AddIdentity in Startup.cs also needed to be replaced with AddIdentityCore,这不再需要 2.0 中的自定义实现。 AddIdentityCore 如果您依赖于其他标准身份验证功能,则需要几行额外的代码,因为默认情况下它不会初始化 Cookie 或 TokenProviders。 (如下所述,在 2.1 中,不再需要更改样板 Startup。)

在 ASP.NET Core 2.1/2.2(撰写本文时为当前版本)中删除角色非常简单。下面以一个新项目为例进行演示:

  1. 创建一个新项目来展示身份,选择:

    1. ASP.NET 核心 Web 应用程序项目类型
    2. Web 应用程序(任一类型,例如 MVC)
    3. 更改身份验证
    4. 个人用户帐户
    5. 在应用程序中存储用户帐户
  2. 从新搭建的身份项目中删除角色

    1. 编辑 Data\ApplicationDbContext.cs,将上下文基础 class 提升到角色之上
      • 来自:ApplicationDbContext : IdentityDbContext
      • 至:ApplicationDbContext : IdentityUserContext<IdentityUser>
    2. 请注意,IdentityUserContext 需要一个 IdentityUser 泛型
    3. 由于 ASP.NET Core 2.1 中的新身份代码,这就是所需要的全部内容
  3. 注意 IdentityUserContext 缺少 Role,因此自定义键类型只需要 2 个参数

    1. 在 ApplicationDbContext.cs 中:IdentityUserContext<IdentityUser<int>, int>
    2. 在Startup.cs中,AddDefaultIdentity<IdentityUser<int>>()和之前一样指定
    3. 提供给_LoginPartial.cshtml的模型也和以前一样指定。 more details on changing Identity models
    4. 如果您更改了身份密钥类型,默认的 EF 迁移过程将失败
      1. 简单地删除 Data\Migrations 在测试中有效,但有以下注意事项:
        • 脚手架项目包含非默认索引
        • 如果您已经 运行 项目,则需要删除数据库
  4. Update/build 反映上述内容的数据库模式。在包管理器控制台中:

    1. Add-Migration RemoveIdentitySchemaRoles
    2. Update-Database
  5. 运行 应用