Как настроить веб-сайт ASP.NET Core 3.1 с идентификацией, аутентификацией и авторизацией для использования Entity Framework 6.4

Предполагается, что цель предоставления версии EF6 для .NET Standard 2.1 — помочь в поэтапном обновлении существующих проектов.

Итак, у нас есть существующее решение, состоящее из веб-сайтов, службы Windows и консольных приложений. Мы находимся в процессе обновления с .NET Framework до .NET Core.

Было бы предпочтительнее, чтобы все это снова заработало в .NET Core, но пока все еще использовало версию EF6 для .NET Standard 2.1.

Модель 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.

E.g. 2

Этот пакет образует мост между ASP.NET Core и инфраструктурой идентификации:

Microsoft.AspNetCore.Identity.EntityFrameworkCore

Таким образом, можно подумать, что для того, чтобы EF6 работал с ASP.NET Core, должен быть пакет, похожий по своей природе (вымышленное имя) на Microsoft.AspNetCore.Identity.EntityFramework6.

Если возможно использовать EF6.4 (включая таблицы, связанные с идентификацией) в сочетании с ASP.NET Core, не могли бы вы указать пример, который позволяет это сделать?

Или, если вы точно знаете, что эта комбинация определенно невозможна, сообщите мне об этом.


person Naked Coder    schedule 31.03.2020    source источник


Ответы (1)


EF6 не поддерживается для ASP.NET Core Identity; вы можете использовать только EF Core. Microsoft любит небрежно предлагать, что вы всегда можете просто использовать EF6 всякий раз, когда есть какой-то недостаток в EF Core (а их постоянно много), но с момента рождения .NET Core все еще существует этот вопиющий вакуум поддержки.

У вас есть три варианта:

  1. Используйте EF Core там, где вам нужна поддержка ASP.NET Core Identity. Вам придется дублировать некоторый код, но вы можете иметь контекст 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, которые могут работать с любым из них. Они также по большей части работают по принципу plug-and-play, в то время как Identity Server требует немного больше усилий.

person Chris Pratt    schedule 31.03.2020