如何从 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 创建了这些角色相关的表
如何在不操作迁移文件的情况下摆脱它们?
你不能,如果你这样做,Identity 很可能会停止运作。不管喜欢与否,身份利用角色。您可以选择不使用此功能,但它仍然存在。
也就是说,从某种意义上说,每个身份验证工件都是一个 "claim"。然而,声明是抽象的概念,而像角色这样的东西有具体的实现。如果您需要授权过滤器,那么您应该使用角色。您可以使用声明,但无论如何您只需要重新实现角色的概念。不要重新发明轮子。
这在 ASP.NET Identity 中一直是可能的,但随着时间的推移变得更容易,因为约定已经从 Roles 转向 Rights、Actions、Claims、Predicates 和其他更可重用和可维护的语义。多年来,我一直在我的 ASP.NET 项目中使用 Identity 和我预先存在的数据库模式(没有角色表)。我承认,由于 ASP.NET Identity 的繁琐复杂性,以及 ASP.NET 中发生的快节奏开源代码更改以及完全缺乏API 参考中的人工文档(完全是机器生成的样板文件)。
在 ASP.NET Core 之前,您可以通过覆盖 UserManager
和 UserStore
实现来实现。通过使用无操作删除 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(撰写本文时为当前版本)中删除角色非常简单。下面以一个新项目为例进行演示:
创建一个新项目来展示身份,选择:
- ASP.NET 核心 Web 应用程序项目类型
- Web 应用程序(任一类型,例如 MVC)
- 更改身份验证
- 个人用户帐户
- 在应用程序中存储用户帐户
从新搭建的身份项目中删除角色
- 编辑 Data\ApplicationDbContext.cs,将上下文基础 class 提升到角色之上
- 来自:
ApplicationDbContext : IdentityDbContext
- 至:
ApplicationDbContext : IdentityUserContext<IdentityUser>
- 请注意,IdentityUserContext 需要一个 IdentityUser 泛型
- 由于 ASP.NET Core 2.1 中的新身份代码,这就是所需要的全部内容
注意 IdentityUserContext
缺少 Role,因此自定义键类型只需要 2 个参数
- 在 ApplicationDbContext.cs 中:
IdentityUserContext<IdentityUser<int>, int>
- 在Startup.cs中,
AddDefaultIdentity<IdentityUser<int>>()
和之前一样指定
- 提供给_LoginPartial.cshtml的模型也和以前一样指定。 more details on changing Identity models
- 如果您更改了身份密钥类型,默认的 EF 迁移过程将失败
- 简单地删除 Data\Migrations 在测试中有效,但有以下注意事项:
- 脚手架项目包含非默认索引
- 如果您已经 运行 项目,则需要删除数据库
Update/build 反映上述内容的数据库模式。在包管理器控制台中:
Add-Migration RemoveIdentitySchemaRoles
Update-Database
运行 应用
根据其他地方的建议,角色是声明的子集,我正在寻找一种干净的方法来询问 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 创建了这些角色相关的表
如何在不操作迁移文件的情况下摆脱它们?
你不能,如果你这样做,Identity 很可能会停止运作。不管喜欢与否,身份利用角色。您可以选择不使用此功能,但它仍然存在。
也就是说,从某种意义上说,每个身份验证工件都是一个 "claim"。然而,声明是抽象的概念,而像角色这样的东西有具体的实现。如果您需要授权过滤器,那么您应该使用角色。您可以使用声明,但无论如何您只需要重新实现角色的概念。不要重新发明轮子。
这在 ASP.NET Identity 中一直是可能的,但随着时间的推移变得更容易,因为约定已经从 Roles 转向 Rights、Actions、Claims、Predicates 和其他更可重用和可维护的语义。多年来,我一直在我的 ASP.NET 项目中使用 Identity 和我预先存在的数据库模式(没有角色表)。我承认,由于 ASP.NET Identity 的繁琐复杂性,以及 ASP.NET 中发生的快节奏开源代码更改以及完全缺乏API 参考中的人工文档(完全是机器生成的样板文件)。
在 ASP.NET Core 之前,您可以通过覆盖 UserManager
和 UserStore
实现来实现。通过使用无操作删除 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(撰写本文时为当前版本)中删除角色非常简单。下面以一个新项目为例进行演示:
创建一个新项目来展示身份,选择:
- ASP.NET 核心 Web 应用程序项目类型
- Web 应用程序(任一类型,例如 MVC)
- 更改身份验证
- 个人用户帐户
- 在应用程序中存储用户帐户
从新搭建的身份项目中删除角色
- 编辑 Data\ApplicationDbContext.cs,将上下文基础 class 提升到角色之上
- 来自:
ApplicationDbContext : IdentityDbContext
- 至:
ApplicationDbContext : IdentityUserContext<IdentityUser>
- 来自:
- 请注意,IdentityUserContext 需要一个 IdentityUser 泛型
- 由于 ASP.NET Core 2.1 中的新身份代码,这就是所需要的全部内容
- 编辑 Data\ApplicationDbContext.cs,将上下文基础 class 提升到角色之上
注意
IdentityUserContext
缺少 Role,因此自定义键类型只需要 2 个参数- 在 ApplicationDbContext.cs 中:
IdentityUserContext<IdentityUser<int>, int>
- 在Startup.cs中,
AddDefaultIdentity<IdentityUser<int>>()
和之前一样指定 - 提供给_LoginPartial.cshtml的模型也和以前一样指定。 more details on changing Identity models
- 如果您更改了身份密钥类型,默认的 EF 迁移过程将失败
- 简单地删除 Data\Migrations 在测试中有效,但有以下注意事项:
- 脚手架项目包含非默认索引
- 如果您已经 运行 项目,则需要删除数据库
- 在 ApplicationDbContext.cs 中:
Update/build 反映上述内容的数据库模式。在包管理器控制台中:
Add-Migration RemoveIdentitySchemaRoles
Update-Database
运行 应用