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

时间:2017-10-24 12:31:57

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

在其他地方读到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创建这些与角色相关的表

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

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

2 个答案:

答案 0 :(得分:2)

这在ASP.NET Identity中始终是可能的,但随着时间的推移,它变得更加容易,因为惯例已从角色转移到权利,行动,主张,谓词以及其他更可重用和可维护的语义。我已经在ASP.NET项目中使用已有的DB模式(没有角色表)使用Identity多年了。我承认,由于ASP.NET Identity的繁琐复杂性,以及ASP.NET中发生的快节奏的开源代码更改以及完全缺乏人工指导的文档,很难理解如何执行此操作在API参考中(完全由机器生成的样板文件)。

在ASP.NET Core之前,您可以通过重写UserManagerUserStore实现来实现。通过不使用操作取消角色请求,或使用更有用且对开发人员更安全的实现(可能不是基于魔术字符串!)覆盖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中的角色非常简单(截至撰写本文时为最新)。这是一个使用新项目进行演示的示例:

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

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

    1. 编辑Data \ ApplicationDbContext.cs,将上下文基类提升到角色上方
      • 来自:ApplicationDbContext : IdentityDbContext
      • 收件人:ApplicationDbContext : IdentityUserContext<IdentityUser>
    2. 请注意,IdentityUserContext需要通用的IdentityUser
    3. 由于ASP.NET Core 2.1中提供了新的身份代码,这就是必需的
  3. 请注意,IdentityUserContext缺少角色,因此自定义键类型仅需要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. EF generates non-functional migrations if you've changed keys
      2. 仅删除Data \ Migrations即可在测试中运行,但需要注意以下几点:
        • 脚手架项目包含的索引不是默认值
        • 如果您已经运行了项目,则需要删除数据库
  4. 更新/构建数据库架构以反映上述内容。在程序包管理器控制台中:

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

答案 1 :(得分:0)

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

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