首页 > 解决方案 > 如何使用身份、身份验证和授权配置 ASP.NET Core 3.1 网站以使用 Entity Framework 6.4

问题描述

提供 .NET Standard 2.1 版本的 EF6 的目的被理解为是协助分阶段升级现有项目。

所以我们有一个由网站、Windows 服务和控制台应用程序组成的现有解决方案。我们正在将其从 .NET Framework 升级到 .NET Core。

最好让它在 .NET Core 中再次运行,但目前仍使用 .NET Standard 2.1 版本的 EF6。

EF6 模型派生自IdentityDbContext以便包含用户、角色等的身份存储。

public class DbContextTasking : IdentityDbContext<AspNetUser, AspNetRole, string, AspNetUserLogin, AspNetUserRole, AspNetUserClaim>

所有代码现在都在 .NET Core 或 .NET Standard 程序集中。

升级后的 Windows 服务和控制台应用程序基本上可以正常工作,但是我们在网站上苦苦挣扎。

尽管令人担忧的是,为了让数据层程序集编译一些 packageReferences 是必要的,它们在解决方案资源管理器中显示黄色三角形警告:

<PackageReference Include="Microsoft.AspNet.Identity.EntityFramework" Version="2.2.3" />

“包 x 是使用 .NET Framework 4.6.1 恢复的……这个包可能不完全兼容……”

暂时忽略这些警告,表演者正在了解如何获得一个带有身份、身份验证和授权的 ASP.NET Core 网站,以使用 EF6。

例如,显示 EF Core 用法的示例在其ConfigureServices功能中有:

services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));

但是'.UseSqlServer'来自程序集Microsoft.EntityFrameworkCore.SqlServer

还有:

services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
                .AddEntityFrameworkStores<DbContextTasking>()
                .AddDefaultTokenProviders();

AddEntityFrameworkStores再次与 EF Core 存储相关。

例如 2

这个包形成了 ASP.NET Core 和身份基础设施之间的桥梁:

Microsoft.AspNetCore.Identity.EntityFrameworkCore

所以有人会认为,要让 EF6 与 ASP.NET Core 一起工作,需要有一个本质上相似的包(组成名称)Microsoft.AspNetCore.Identity.EntityFramework6

如果可以将 EF6.4(包括身份相关表)与 ASP.NET Core 结合使用,请您指出实现此目的的示例吗?

或者,如果您知道这种组合绝对不可能,也请告诉我。

标签: entity-framework-coreasp.net-identityasp.net-core-3.1entity-framework-6.4

解决方案


ASP.NET Core Identity 不支持 EF6;您只能使用 EF Core。微软喜欢随意地建议,只要 EF Core 有一些不足(而且经常有很多不足),你总是可以只使用 EF6,但自 .NET Core 诞生以来仍然存在这种明显的支持真空。

你有三个选择:

  1. 在需要 ASP.NET Core Identity 支持的地方使用 EF Core。您必须复制一些代码,但您可以拥有一个 EF Core 上下文和一个 EF 6 上下文,它们都连接到同一个数据库。您应该只将一端或另一端(很可能是 EF Core 端)视为数据库优先,因此不要从那里运行迁移。但是,由于 ASP.NET Core Identity 与 ASP.NET Identity 从根本上不同,您需要将任何现有的 Identity 表替换/迁移到 Core 版本,然后关闭 ASP.NET Identity 的任何使用。换句话说,您必须独占选择其中一个。

  2. ASP.NET Core Identity 在技术上可以与任何数据源一起使用。EF Core 就是开箱即用的东西。如果您有时间和意愿,您可以使用任何您想要的技术来实现自定义商店。这是一项艰巨的任务,但如果这是您需要的,则可以实现。

  3. 您可以使用像 Identity Server 这样的集中式身份验证提供程序。这实质上抽象了身份验证层,因此应用程序是在 ASP.NET 还是 ASP.NET Core 中并不重要。但是,Identity Server 4 仅与 ASP.NET Core Identity 和 EF Core 原生集成(本质上是相同的问题)。有一个旧版本的 Identity Server 是为 ASP.NET 构建的,但我不知道它的状态(是否仍然受支持、维护等),或者您是否可以使用 ASP.NET Core 使其工作坦率地说,如果您的目标是 .NET Framework 和 .NET Core 之间的交叉兼容,我会选择 Azure AD 或 Auth0 之类的东西,它们都可以使用。它们在大多数情况下也是即插即用的,而 Identity Server 需要更多的麻烦。


推荐阅读