在其他地方读到Roles是Claims的子集的建议,我正在寻找一种干净的方式来询问ASP.NET Identity中的EF Core实现不要在ASP.NET Identity Core 2.0中创建与角色相关的表VS 2017中的模板。只需要声明。 模板使用
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创建这些与角色相关的表
如何在不操纵迁移文件的情况下摆脱它们?
答案 0 :(得分:2)
这在ASP.NET Identity中始终是可能的,但随着时间的推移,它变得更加容易,因为惯例已从角色转移到权利,行动,主张,谓词以及其他更可重用和可维护的语义。我已经在ASP.NET项目中使用已有的DB模式(没有角色表)使用Identity多年了。我承认,由于ASP.NET Identity的繁琐复杂性,以及ASP.NET中发生的快节奏的开源代码更改以及完全缺乏人工指导的文档,很难理解如何执行此操作在API参考中(完全由机器生成的样板文件)。
在ASP.NET Core之前,您可以通过重写UserManager
和UserStore
实现来实现。通过不使用操作取消角色请求,或使用更有用且对开发人员更安全的实现(可能不是基于魔术字符串!)覆盖RoleAttribute
实现,就不会引起对角色表的注意。即使使用默认的实现,如果您从未使用默认的Role属性实现或询问的Role问题,则可以删除表而不会产生任何后果。默认的ASP.NET脚手架都不取决于角色。
在原始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
,在2.0中不再需要自定义实现。对Startup.cs中对AddIdentity
的调用也需要替换为AddIdentityCore
。如果您依赖于其他标准身份验证功能,AddIdentityCore
会需要几行额外的代码,因为默认情况下它不会初始化Cookies或TokenProviders。 (如下所述,在2.1中,不再需要对样板Startup
进行更改。)
删除ASP.NET Core 2.1 / 2.2中的角色非常简单(截至撰写本文时为最新)。这是一个使用新项目进行演示的示例:
创建一个新项目以演示身份,选择:
从新搭建的Identity项目中删除角色
ApplicationDbContext : IdentityDbContext
ApplicationDbContext : IdentityUserContext<IdentityUser>
请注意,IdentityUserContext
缺少角色,因此自定义键类型仅需要2个参数
IdentityUserContext<IdentityUser<int>, int>
AddDefaultIdentity<IdentityUser<int>>()
被指定为以前的更新/构建数据库架构以反映上述内容。在程序包管理器控制台中:
Add-Migration RemoveIdentitySchemaRoles
Update-Database
运行应用
答案 1 :(得分:0)
你不能,如果你这样做,很可能身份会停止运作。无论喜欢与否,Identity都会使用角色。您可以选择不利用此功能,但它仍然存在。
也就是说,在某种意义上,每个身份验证工件都是“声明”。然而,声明是抽象的概念,而像角色这样的东西具有具体的实现。如果您需要授权过滤器,则应使用角色。您可以使用声明,但无论如何您只需重新实现角色的概念。不要重新发明轮子。