【问题标题】:How to remove the role-related tables from ASP.NET Identity Core 2.0如何从 ASP.NET Identity Core 2.0 中删除与角色相关的表
【发布时间】:2017-10-24 12:31:56
【问题描述】:

根据在其他地方阅读的建议,即角色是声明的子集,我正在寻找一种干净的方法来要求 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 会创建这些 Roles 相关的表

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

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

【问题讨论】:

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


    【解决方案1】:

    这在 ASP.NET Identity 中一直是可能的,但随着时间的推移变得越来越容易,因为约定已经从角色转移到权利、操作、声明、谓词和其他更可重用和可维护的语义。多年来,我一直在我的 ASP.NET 项目中使用 Identity 以及我预先存在的数据库模式(没有角色表)。我承认,由于 ASP.NET 身份的繁琐复杂性以及 ASP.NET 中发生的快节奏开源代码更改以及完全缺乏人工信息文档,因此很难理解如何做到这一点在 API 参考中(完全是机器生成的样板)。

    在 ASP.NET Core 之前,您可以通过覆盖 UserManagerUserStore 实现来做到这一点。通过使用 no-ops 将 Role 请求存根,或者用更有用且对开发人员安全的实现覆盖 RoleAttribute 实现(可能不是基于魔术字符串!),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 的调用也需要替换为AddIdentityCoreAddIdentityCore 如果您依赖其他标准身份验证功能,则需要几行额外的代码,因为默认情况下它不会初始化 Cookie 或 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&lt;IdentityUser&gt;
      2. 请注意,IdentityUserContext 需要 IdentityUser 泛型
      3. 由于 ASP.NET Core 2.1 中的新身份代码,这就是全部所需
    3. 注意IdentityUserContext 缺少角色,因此自定义键类型只需要 2 个参数

      1. 在 ApplicationDbContext.cs 中:IdentityUserContext&lt;IdentityUser&lt;int&gt;, int&gt;
      2. 在 Startup.cs 中,AddDefaultIdentity&lt;IdentityUser&lt;int&gt;&gt;() 与之前一样指定
      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 即可在测试中使用,但需要注意以下几点:
          • 脚手架项目包含非默认索引
          • 如果您已经运行该项目,则需要删除 DB
    4. 更新/构建数据库架构以反映上述内容。在包管理器控制台中:

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

    【讨论】:

    • 这是我得出的最佳答案。不幸的是,AddDefaultIdentity 使用了 defaultUI,这是一种污染。但除了创建一个新的 AddIdentity 之外,我想不出更好的解决方案。
    【解决方案2】:

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

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

    【讨论】:

    • 您能否就为什么声明是抽象概念进行更多争论?我仍然可以使用 Claims 进行过滤,这可以看作是具体的东西。 (?)docs.microsoft.com/en-us/aspnet/core/security/authorization/…
    • 它们是抽象的,因为它们没有隐含的功能。它们只是数据。您必须围绕该数据创建功能。例如,您可以添加一个声明,表明用户是管理员,但是您需要一些逻辑来提取该声明、检查值并就用户的状态做出决定。角色只是包含此功能的声明。
    • 您是否有一些相关文档详细讨论了声明和角色之间的差异?提供的链接似乎缺少。谢谢
    • 与此相关,我想设置一个买家/卖家数据库,如果我能帮你搞定,角色将是这里的方式。
    • 我没有文档可以指点您,但这只是基本的计算机科学。声明是数据令牌。在 Identity 的实现中,它实际上是一个字典或键值对。角色实际上是带有行为的声明,即声明的值决定了授权级别。
    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    相关资源
    最近更新 更多