Это всегда было возможно в ASP.NET Identity, но со временем стало проще, поскольку соглашения отошли от ролей к правам, действиям, утверждениям, предикатам и другим более многоразовым и поддерживаемым семантикам. Я много лет использую Identity в своих проектах ASP.NET с уже существующими схемами БД (в которых нет таблиц ролей). Признаюсь, довольно сложно понять, как это сделать из-за громоздкой сложности ASP.NET Identity, а также быстро меняющихся изменений открытого исходного кода, происходящих в ASP.NET, в сочетании с полным отсутствием человеко-информированной документации. в справке по API (которая полностью сгенерирована машиной).
До ASP.NET Core это можно было сделать, переопределив реализации UserManager
и UserStore
. Заглушая запросы ролей без операций или заменяя реализацию RoleAttribute
более полезной и безопасной для разработчиков (вероятно, не основанной на магических строках!), отсутствие таблиц ролей остается незамеченным. Даже при использовании реализаций по умолчанию, если вы никогда не использовали реализации атрибутов ролей по умолчанию или не задавали вопросы о ролях, таблицы можно было бы удалить без каких-либо последствий. Ни один из шаблонов ASP.NET по умолчанию не зависит от ролей.
В исходных версиях ASP.NET Core Identity 1.0/1.1 это делалось путем реализации UserStore
без дополнительного интерфейса IUserRoleStore
. Информацию об этом можно найти в разделе основная документация по удостоверению ASP.NET Core.
Что касается ASP.NET Core 2.0 (по вашему основному вопросу), вы можете сделать это проще, получив свой контекст от IdentityUserContext
вместо IdentityDbContext
, как показано в примере ниже. Это больше не требовало пользовательских реализаций в версии 2.0 из-за новый UserOnlyStore
. Вызов AddIdentity
в Startup.cs также необходимо заменить на AddIdentityCore
. AddIdentityCore
требует несколько дополнительных строк кода, если вы зависите от других стандартных функций аутентификации, поскольку по умолчанию он не инициализирует файлы cookie или TokenProviders. (Как отмечено ниже, в версии 2.1 изменения шаблона Startup
больше не требуются.)
Удалить роли в ASP.NET Core 2.1/2.2 (на момент написания этой статьи) довольно просто. Вот пример использования нового проекта для демонстрации:
Создайте новый проект для демонстрации личности, выбрав:
- ASP.NET Core Web Application project type
- Веб-приложение (любой тип, например MVC)
- Изменить аутентификацию
- Индивидуальные учетные записи пользователей
- Храните учетные записи пользователей в приложении
Удалите роли из недавно созданного проекта Identity.
- edit Data\ApplicationDbContext.cs, elevating the context base class above roles
- from:
ApplicationDbContext : IdentityDbContext
- to:
ApplicationDbContext : IdentityUserContext<IdentityUser>
- обратите внимание, что IdentityUserContext требует универсального IdentityUser
- из-за нового идентификационного кода в ASP.NET Core 2.1 это все, что требуется
Обратите внимание, что в IdentityUserContext
отсутствует роль, поэтому для настраиваемых типов ключей требуется только 2 аргумента.
- in ApplicationDbContext.cs:
IdentityUserContext<IdentityUser<int>, int>
- в Startup.cs по-прежнему указано
AddDefaultIdentity<IdentityUser<int>>()
- Модель, предоставляемая _LoginPartial.cshtml, также указывается, как и раньше. подробнее об изменении моделей идентификации
- if you've changed identity key type, the default EF Migration process fails
- EF generates non-functional migrations if you've changed keys
- simply deleting Data\Migrations works in test, with these caveats:
- the scaffolded project included indices that are not default
- если вы уже запустили проект, вам нужно удалить БД
Обновите/создайте схему базы данных, чтобы отразить вышеизложенное. В консоли диспетчера пакетов:
Add-Migration RemoveIdentitySchemaRoles
Update-Database
Запустите приложение
person
shannon
schedule
12.01.2019