Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Автор Айзек Левин (Isaac Levin)
В этой статье показано, как перенести схему базы данных для приложений ASP.NET с помощью проверки подлинности членства в ASP.NET Core 2.0 Identity.
Примечание.
В этом документе приведены шаги, необходимые для переноса схемы базы данных для приложений на основе членства ASP.NET в схему базы данных, используемую для ASP.NET Core Identity. Дополнительные сведения о миграции с проверки подлинности на основе членства ASP.NET в ASP.NET Identityсм. в статье "Перенос существующего приложения из членства в SQL в ASP.NET Identity". Дополнительные сведения о ASP.NET Core Identityсм. в статье "Общие Identity сведения о ASP.NET Core".
Проверка схемы членства
До ASP.NET 2.0 разработчикам было поручено создать весь процесс проверки подлинности и авторизации для своих приложений. С ASP.NET 2.0 членство было представлено, предоставляя стандартное решение для обработки безопасности в ASP.NET приложениях. Теперь разработчики смогли загрузить схему в базу данных SQL Server с помощью средства регистрации SQL Server ASP.NET (Aspnet_regsql.exe
) (больше не поддерживается). После выполнения этой команды в базе данных были созданы следующие таблицы.
Чтобы перенести существующие приложения в ASP.NET Core 2.0 Identity, данные в этих таблицах необходимо перенести в таблицы, используемые новой Identity схемой.
схема ASP.NET Core Identity 2.0
ASP.NET Core 2.0 следует принципу, представленному Identity в ASP.NET 4.5. Хотя принцип является общим, реализация между платформами отличается, даже между версиями ASP.NET Core (см . проверку подлинности миграции и Identity ASP.NET Core 2.0).
Самый быстрый способ просмотра схемы для ASP.NET Core 2.0 Identity — создать новое приложение ASP.NET Core 2.0. Выполните следующие действия в Visual Studio 2017:
Выберите File>New>Project ( Файл > Создать > Проект).
Создайте проект ASP.NET Core Web Application с именем CoreIdentitySample.
Выберите ASP.NET Core 2.0 в раскрывающемся списке и выберите веб-приложение. Этот шаблон создает Razor приложение Pages . Перед нажатием кнопки "ОК" нажмите кнопку "Изменить проверку подлинности".
Выберите Identity для шаблонов. Наконец, нажмите кнопку "ОК", а затем "ОК". Visual Studio создает проект с помощью шаблона ASP.NET Core Identity .
Выберите Инструменты NuGet диспетчер пакетов диспетчер пакетов консоли> (PMC).>
Перейдите к корневому каталогу проекта в PMC и выполните команду Entity Framework (EF) Core
Update-Database
.ASP.NET Core 2.0 Identity используется EF Core для взаимодействия с базой данных, в котором хранятся данные проверки подлинности. Чтобы созданное приложение работало, необходимо создать базу данных для хранения этих данных. После создания нового приложения самый быстрый способ проверки схемы в среде базы данных — создать базу данных с помощью EF Core миграций. Этот процесс создает базу данных либо локально, либо в другом месте, которая имитирует эту схему. Дополнительные сведения см. в предыдущей документации.
EF Coreкоманды используют строка подключения для базы данных, указанной в
appsettings.json
. Следующая строка подключения предназначена для базы данных на localhost с именем asp-net-core-identity. В этом параметре EF Core настроено использованиеDefaultConnection
строка подключения.{ "ConnectionStrings": { "DefaultConnection": "Server=localhost;Database=aspnet-core-identity;Trusted_Connection=True;MultipleActiveResultSets=true" } }
Предупреждение
В этой статье показано использование строка подключения. С локальной базой данных пользователь не должен пройти проверку подлинности, но в рабочей среде строка подключения иногда включают пароль для проверки подлинности. Учетные данные владельца ресурса (ROPC) — это риск безопасности, который следует избежать в рабочих базах данных. Рабочие приложения должны использовать самый безопасный поток проверки подлинности. Дополнительные сведения о проверке подлинности для приложений, развернутых в тестовых или рабочих средах, см. в разделе "Безопасные потоки проверки подлинности".
Выберите view>SQL Server обозреватель объектов. Разверните узел, соответствующий имени базы данных, указанному в свойстве
ConnectionStrings:DefaultConnection
appsettings.json
.Команда
Update-Database
создала базу данных, указанную схемой, и все данные, необходимые для инициализации приложения. На следующем рисунке показана структура таблицы, созданная с помощью предыдущих шагов.
Перенос схемы
Существуют тонкие различия в структурах таблиц и полях для членства и ASP.NET Core Identity. Шаблон существенно изменился для проверки подлинности и авторизации с помощью ASP.NET и приложений ASP.NET Core. Ключевые объекты, которые по-прежнему используются с Identityпользователями и ролями. Ниже приведены таблицы сопоставления для пользователей, ролей и UserRoles.
Пользователи
Identity ( dbo.AspNetUsers ) столбец |
Тип | Членство ( dbo.aspnet_Users / dbo.aspnet_Membership ) столбец |
Тип |
---|---|---|---|
Id |
string |
aspnet_Users.UserId |
string |
UserName |
string |
aspnet_Users.UserName |
string |
Email |
string |
aspnet_Membership.Email |
string |
NormalizedUserName |
string |
aspnet_Users.LoweredUserName |
string |
NormalizedEmail |
string |
aspnet_Membership.LoweredEmail |
string |
PhoneNumber |
string |
aspnet_Users.MobileAlias |
string |
LockoutEnabled |
bit |
aspnet_Membership.IsLockedOut |
bit |
IsLockedOut
не сопоставляет LockoutEnabled
с .
IsLockedOut
устанавливается, если у пользователя было слишком много неудачных имен входа и заблокировано в течение заданного времени.
LockoutEnabled
включает блокировку пользователя с слишком большим количеством неудачных попыток входа. Если у пользователя слишком много неудачных попыток входа, LockoutEnd
устанавливается дата в будущем, и пользователь не сможет войти до этой даты. Если LockoutEnabled
значение равно false, то пользователь никогда не заблокирован для слишком большого количества неудачных попыток входа. Для OWASP временная блокировка учетной записи после нескольких неудачных попыток слишком проста для атак DoS на законных пользователей.
Дополнительные сведения о блокировке см. в статье OWASP Testing for Weak Lock Out Mechanism.
Приложения, перенесенные в Identity это желание включить блокировку входа с ошибкой, должны иметь LockoutEnabled
значение true в рамках миграции.
Примечание.
Не все сопоставления полей похожи на связи "один к одному" от членства до ASP.NET Core Identity. Предыдущая таблица принимает схему пользователя членства по умолчанию и сопоставляет ее с схемой ASP.NET Core Identity . Любые другие настраиваемые поля, которые использовались для членства, необходимо сопоставить вручную. В этом сопоставлении нет карты для паролей, так как критерии пароля и соли паролей не переносятся между двумя. Рекомендуется оставить пароль пустым и попросить пользователей сбросить свои пароли. В ASP.NET Core IdentityLockoutEnd
следует задать дату в будущем, если пользователь заблокирован. Это показано в скрипте миграции.
Роли
Identity ( dbo.AspNetRoles ) столбец |
Тип | Членство ( dbo.aspnet_Roles ) столбец |
Тип |
---|---|---|---|
Id |
string |
RoleId |
string |
Name |
string |
RoleName |
string |
NormalizedName |
string |
LoweredRoleName |
string |
Роли пользователя
Identity ( dbo.AspNetUserRoles ) столбец |
Тип | Членство ( dbo.aspnet_UsersInRoles ) столбец |
Тип |
---|---|---|---|
RoleId |
string |
RoleId |
string |
UserId |
string |
UserId |
string |
Ссылайтесь на предыдущие таблицы сопоставления при создании скрипта миграции для пользователей и ролей. В следующем примере предполагается, что на сервере базы данных есть две базы данных. Одна база данных содержит существующую схему и данные членства ASP.NET. Другая база данных CoreIdentitySample была создана с помощью описанных выше шагов. Дополнительные сведения см. в комментариях.
-- THIS SCRIPT NEEDS TO RUN FROM THE CONTEXT OF THE MEMBERSHIP DB
BEGIN TRANSACTION MigrateUsersAndRoles
USE aspnetdb
-- INSERT USERS
INSERT INTO CoreIdentitySample.dbo.AspNetUsers
(Id,
UserName,
NormalizedUserName,
PasswordHash,
SecurityStamp,
EmailConfirmed,
PhoneNumber,
PhoneNumberConfirmed,
TwoFactorEnabled,
LockoutEnd,
LockoutEnabled,
AccessFailedCount,
Email,
NormalizedEmail)
SELECT aspnet_Users.UserId,
aspnet_Users.UserName,
-- The NormalizedUserName value is upper case in ASP.NET Core Identity
UPPER(aspnet_Users.UserName),
-- Creates an empty password since passwords don't map between the 2 schemas
'',
/*
The SecurityStamp token is used to verify the state of an account and
is subject to change at any time. It should be initialized as a new ID.
*/
NewID(),
/*
EmailConfirmed is set when a new user is created and confirmed via email.
Users must have this set during migration to reset passwords.
*/
1,
aspnet_Users.MobileAlias,
CASE
WHEN aspnet_Users.MobileAlias IS NULL THEN 0
ELSE 1
END,
-- 2FA likely wasn't setup in Membership for users, so setting as false.
0,
CASE
-- Setting lockout date to time in the future (1,000 years)
WHEN aspnet_Membership.IsLockedOut = 1 THEN Dateadd(year, 1000,
Sysutcdatetime())
ELSE NULL
END,
aspnet_Membership.IsLockedOut,
/*
AccessFailedAccount is used to track failed logins. This is stored in
Membership in multiple columns. Setting to 0 arbitrarily.
*/
0,
aspnet_Membership.Email,
-- The NormalizedEmail value is upper case in ASP.NET Core Identity
UPPER(aspnet_Membership.Email)
FROM aspnet_Users
LEFT OUTER JOIN aspnet_Membership
ON aspnet_Membership.ApplicationId =
aspnet_Users.ApplicationId
AND aspnet_Users.UserId = aspnet_Membership.UserId
LEFT OUTER JOIN CoreIdentitySample.dbo.AspNetUsers
ON aspnet_Membership.UserId = AspNetUsers.Id
WHERE AspNetUsers.Id IS NULL
-- INSERT ROLES
INSERT INTO CoreIdentitySample.dbo.AspNetRoles(Id, Name)
SELECT RoleId, RoleName
FROM aspnet_Roles;
-- INSERT USER ROLES
INSERT INTO CoreIdentitySample.dbo.AspNetUserRoles(UserId, RoleId)
SELECT UserId, RoleId
FROM aspnet_UsersInRoles;
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION MigrateUsersAndRoles
RETURN
END
COMMIT TRANSACTION MigrateUsersAndRoles
После завершения предыдущего скрипта приложение ASP.NET Core Identity , созданное ранее, заполняется пользователями членства. Перед входом пользователям необходимо изменить пароли.
Примечание.
Если в системе членства были пользователи с именами пользователей, которые не совпадали с их адресом электронной почты, изменения необходимы для того, чтобы приложение было создано ранее для размещения этого адреса. Шаблон по умолчанию ожидает UserName
и Email
будет одинаковым. Для ситуаций, в которых они отличаются, процесс входа необходимо изменить, чтобы использовать UserName
вместо Email
него.
PageModel
На странице входа, расположенной по адресу, удалите [EmailAddress]
атрибут из свойства Email. Переименуйте его в UserName. Для этого требуется изменение, где бы ни EmailAddress
упоминалось, в представлении и pageModel. Результат имеет следующий вид.
Следующие шаги
В этом руководстве вы узнали, как перенести пользователей из членства SQL в ASP.NET Core 2.0 Identity. Дополнительные сведения о ASP.NET Core Identityсм. в разделе "Общие сведения".Identity
ASP.NET Core