ASP.NET 成员资格身份验证从迁移到 ASP.NET Core 2.0 标识Migrate from ASP.NET Membership authentication to ASP.NET Core 2.0 Identity
本文演示如何迁移使用成员资格到 ASP.NET Core 2.0 标识的身份验证的 ASP.NET 应用程序的数据库架构。
备注
本文档提供将基于 ASP.NET 成员资格的应用程序的数据库架构迁移到用于 ASP.NET Core 标识的数据库架构所需的步骤。有关从基于 ASP.NET 成员身份的身份验证迁移到 ASP.NET Identity 的详细信息,请参阅。有关 ASP.NET Core 标识的详细信息,请参阅ASP.NET Core 上的标识简介。
在 ASP.NET 2.0 之前,开发人员负责为其应用创建整个身份验证和授权过程。使用 ASP.NET 2.0,引入了成员身份,提供了一个样本解决方案来处理 ASP.NET 应用中的安全性。开发人员现在可以使用的命令将架构启动到 SQL Server 数据库中。运行此命令后,将在数据库中创建以下表。
若要将现有应用迁移到 ASP.NET Core 2.0 标识,这些表中的数据需要迁移到使用新的标识架构的表。
ASP.NET Core 2.0 遵循 ASP.NET 4.5 中引入的标识原则。尽管此原则是共享的,但在不同版本的 ASP.NET Core (请参阅将)之间的实现不同。
ASP.NET Core 2.0 标识查看架构的最快方法是创建新的 ASP.NET Core 2.0 应用程序。在 Visual Studio 2017 中执行以下步骤:
创建一个名为CoreIdentitySample的新ASP.NET Core Web 应用程序项目。
在下拉列表中选择ASP.NET Core 2.0 ,然后选择 " Web 应用程序"。此模板生成Razor Pages应用。单击 "确定" 之前,请单击 "更改身份验证"。
为标识模板选择单个用户帐户。最后,单击 "确定",然后单击 "确定" 。Visual Studio 创建项目时使用 ASP.NET Core 标识模板。
选择 "工具" > NuGet 包管理器" > 程序包管理器控制台" 打开 "包管理器控制台" (PMC)窗口。
导航到 PMC 中的项目根,并运行 命令。
ASP.NET Core 2.0 标识使用 EF Core 与存储身份验证数据的数据库进行交互。为了使新创建的应用程序正常工作,需要有数据库来存储此数据。创建新应用后,在数据库环境中检查架构的最快方法是使用EF Core 迁移来创建数据库。此过程将创建一个在本地或其他位置模拟该架构的数据库。有关详细信息,请查看前面的文档。
EF Core 命令使用appsettings中指定的数据库的连接字符串。以下连接字符串针对名为 .asp 的__localhost上的数据库。在此设置中,EF Core 配置为使用 DefaultConnection
连接字符串。
- 选择 "查看 > SQL Server 对象资源管理器。展开对应于appsettings的
ConnectionStrings:DefaultConnection
属性中指定的数据库名称的节点。
Update-Database
命令创建了用架构指定的数据库以及应用初始化所需的任何数据。下图描绘了在前面的步骤中创建的表结构。
有细微的差别的表结构和成员身份和 ASP.NET Core 标识字段。模式已显著更改身份验证/授权与 ASP.NET 和 ASP.NET Core 应用程序。仍用于标识的关键对象是用户和角色。下面是用户、角色和UserRoles的映射表。
备注
并非所有字段映射类似都于从成员资格到 ASP.NET Core 标识的一对一关系。前面的表使用默认成员资格用户架构,并将其映射到 ASP.NET Core 标识架构。需要手动映射用于成员身份的任何其他自定义字段。在此映射中,无密码映射,因为密码条件和密码 salts 不会在两者之间迁移。建议将密码保留为 null 并要求用户重置其密码。在 ASP.NET Core 标识中,如果用户被锁定,应将 LockoutEnd
设置为将来的某个日期。这会显示在迁移脚本中。
创建用户和角色的迁移脚本时引用前面的映射表。下面的示例假定数据库服务器上有两个数据库。一个数据库包含现有的 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,
PhoneNumber,
PhoneNumberConfirmed,
TwoFactorEnabled,
LockoutEnd,
LockoutEnabled,
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,
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
完成上述脚本后,将向成员资格用户填充先前创建的 ASP.NET Core 标识应用。用户需要在登录之前更改密码。
备注
如果成员资格系统中的用户的用户名与其电子邮件地址不匹配,则需要对之前创建的应用进行更改,以满足此要求。默认模板要求 UserName
和 Email
相同。对于它们不同的情况,需要将登录过程修改为使用 UserName
而不是 Email
。
在登录页的 PageModel
,位于Pages\Account\Login.cshtml.cs,从Email属性中删除 [EmailAddress]
属性。将其重命名为UserName。这需要在视图和PageModel中 EmailAddress
提到的任何位置进行更改。结果应类似如下所示:
在本教程中,您学习了如何移植到 ASP.NET Core 2.0 标识从 SQL 成员资格用户。有关 ASP.NET Core 标识的详细信息,请参阅。