我有一个使用标识在MVC5上生成的Web应用程序。我希望将此项目转换为ASP.NET Core 2.2 Web应用程序。我创建了一个新的ASP.NET Core 2.2 Web应用程序,并将身份验证设置为“个人用户帐户”,然后通过执行these instructions将我的数据库添加到项目中。然后,我将一个新的“标识支架”项添加到项目中,添加了迁移并更新了数据库。
我注册了一个测试用户,当我检查SQL管理服务器时,我看到它为此项目创建了一个新数据库,尽管我的连接字符串是针对我的旧数据库的。
我想保留我的旧数据库,但转换它使用新的身份剃刀网页是内置在与ASP.NET核心。什么是最好的方式去做这件事?
6条答案
按热度按时间oxf4rvwz1#
升级身份表后,您可能需要更新现有用户口令散列。
AspNetUsers
表中的某些新列将具有NULL
值。首先运行以下命令:我们需要一种方法来区分哪些用户正在使用新的哈希版本。
一种方法是向IdentityUser添加新属性:
现有用户将默认
PasswordHashVersion
等于零(OldMvc),新注册用户将默认为1(Core)。如果您有更聪明的方法来检测哈希值是来自新算法还是旧算法,则不需要这样做。然后,我们创建一个自定义PasswordHash,它使用old default hash algorithm implementation:
此类继承了新的身份核心
PasswordHasher
。如果用户的密码哈希版本已经使用新算法(例如HashVersion = Core),则我们只需从使用新算法的PasswordHasher
调用基方法。否则,使用旧身份算法验证密码。如果密码匹配,我们将用户密码散列版本更新为
Core
,并返回PasswordVerificationResult.SuccessRehashNeeded
以强制使用新算法更新现有散列。最后,你需要确保你的自定义
PasswordHasher
正在被使用。将以下代码添加到ConfigureServices
中的Startup.cs
:必须在对
AddIdentity
、AddDefaultIdentity
或AddIdentityCore
的任何调用之后添加此变量。这将在用户进行身份验证时缓慢更新密码哈希。
zsbz8rwp2#
我刚刚能够通过以下步骤成功地将一个.NET 4.5.2项目迁移到.NET Core 3.1
1.使用
Scaffold-DbContext
基于现有数据库1(https://www.entityframeworktutorial.net/efcore/create-model-for-existing-database-in-ef-core.aspx)创建模型1.从生成的上下文中删除所有与AspNet相关的表以及不再需要的.cs文件。
1.将
base.OnModelCreating(modelBuilder);
添加到上下文文件中生成的OnModelCreating
方法中。2(https://stackoverflow.com/a/34786782/3093561)1.运行以下脚本以更新/创建标识表3(https://stackoverflow.com/a/43377313/3093561) 4(https://stackoverflow.com/a/57074910/3093561)
1.在
Startup.cs
文件上,设置密码哈希兼容模式以考虑IdentityV 2aydmsdu93#
另一种解决方案是将数据导出/导入到新表中,我之所以这样做是出于几个不同的原因,但最终我不想修改原始源表,以防我需要快速而轻松地恢复它。
长话短说,您可以直接将旧数据导入/导出到新的Identity表中,另外唯一需要的是规范化的用户名和电子邮件值。
如果Identity可以在内部处理这些问题,就太好了,因为它可以在用户第一次登录时处理(更新)新的密码哈希、安全戳和并发戳而不会出现问题。
超级快速和简单的方法,我迁移我的用户与完整的密码:
**1)**将旧版本Identity上的用户表导出到CSV文件。
**2)**在Excel中打开该csv文件,并向CSV文件中添加三列,用于两个缺失的规范化列(用户名和电子邮件)和一个缺失的并发戳列(实际上不需要并发列)。
**3)**在第一个空白的规范化列(通常是c2)中,添加Excel公式
=UPPER(b2)
(其中b2是您尝试规范化的第一个值所在的字段...例如,直接导出时用户名=b2或电子邮件=d2,您将规范化列放在非规范化列旁边)。**4)**将该公式向下拖动到电子表格的末尾,将所有用户名和电子邮件规范为大写值(即,所有大写=规范化)。
**5)**将大写值从电子表格中复制出来,粘贴到一个空的记事本文件中......然后将它们复制回电子表格中的同一个位置(这会用规范化值覆盖公式。Excel可能足够聪明,可以摆脱公式,并将规范化值保存在CSV保存中,但我没有测试它)。
**6)**将电子表格保存为CSV并将其导入到新身份AspnetUsers表中。
并发戳可以留空,用户第一次登录时,最新的标识将处理所有其他事务。
如果您在新版本中没有启用该功能,而在旧版本中启用了该功能,则Identity也不会登录用户名(因此您需要启用该功能或将用户名转换为相关的电子邮件地址,然后才能成功登录)。
这并不漂亮,但对于一次性工作,我用这种方法将我的用户从Identity 4.0.30319迁移到Core 2.2只花了不到15分钟,而且不需要更改密码。我花了比迁移用户更长的时间来输入所有这些内容。希望它能有所帮助。
l0oc07j24#
我已经编写了用于迁移到AspNetCore Identity的SQL脚本。
此脚本与AspNet Identity完全向后兼容,因为我向表中添加了新列并扩展了已存在的列。
让我们看一下通过方案比较生成的屏幕截图:
你可以看到最后的剧本
pgccezyw5#
虽然微软的documentation有些帮助,但最有帮助的信息在评论中。
我能够使用以下步骤迁移现有的数据库:
与EF6匹配。之后,您可以生成一个脚本,用于将EF6更改为EF Core。
身份验证时使用NormalizedEmail,
NormalizedUserName列。因此我们需要更新这两列
利用我们现有的数据。
下面是更新表的脚本的GitHub链接。Migration.zip
7tofc5zh6#
我觉得应该重新开始。
步骤1:
创建迁移以创建新的Identity表。(我的新Identity nuget包版本为
6.0.10
)1.1为迁移创建
DbContext
:注意:我删除了创建旧Identity表的旧迁移文件和模型快照。
ApplicationUser
看起来像这样:1.2创建迁移:
第二步:
使用步骤1中的迁移创建新标识表:
第三步:
使用以下脚本将数据从旧表复制到新表:
3.1复制用户:
3.2复制角色:
3.3将用户复制到角色Map:
3.4您可能还需要复制其他表。我没有这样做,因为我没有使用其他表。
第四步:
您可能需要在
Program.cs
中添加 PasswordHasherCompatibilityMode。我没有这样做,因为在我的系统中,我们使用Active Directory密码验证用户。类似于this。