ASP.NET 身份 table update/migration 在运行时

ASP.NET Identity table update/migration at runtime

我们正在创建一个新的网络应用程序,它将 update/migrate 一个现有的数据库,包括用户信息。由于密码在用户 table 中经过 SHA 加密,我需要在用户登录时在运行时进行迁移。

为了做到这一点,我想挂钩用户验证代码 - 如果用户存在于新身份用户 table 中,很好 - 我们完成了 - 使用它。否则检查旧用户table(并使用旧密码验证机制验证密码),在新身份table中创建用户,从旧table中删除旧用户(或标记为已迁移),然后 return 该新身份用户。

这是一个合理的方法吗?有什么例子可以作为起点吗?

注意:我想使用标准 ASP.NET Identity 2.0 table 结构,但用户 ID 将是 int,因为现有模式依赖于 int 用户 ID。

编辑:现有的网络应用程序将消失,我们将用新的网络应用程序(具有 ASP.NET 标识)替换它,但我们仍将指向现有数据库(包含旧用户 table 和其他数据)。添加到 DB 的将是新的 ASP.NET 身份 tables 和加入这些 tables 的任何更新,而不是旧用户 table.

看起来 ApplicationOAuthProvider:GrantResourceOwnerCredentials 是一个不错的地方,我们正在做 userManager.FindAsync() 以在新用户 table 中寻找用户(使用密码)。如果失败(用户 == 空检查),我将添加代码以在旧用户 table 中查找用户,如果存在(并且密码通过哈希测试),将在新用户 table 中创建用户] 使用旧用户 table 数据和新密码哈希 - 然后将旧用户 table 记录标记为 "migrated" 或 "upgraded"

官方迁移指南中描述的处理遗留密码哈希的好方法:http://www.asp.net/identity/overview/migrations/migrating-an-existing-website-from-sql-membership-to-aspnet-identity

在该页面上搜索 SQLPasswordHasher 并查看他们如何进行密码匹配。

基本上这个想法很简单 - 当您将系统更新为 Identity 时,您将所有旧用户及其散列(和盐)复制到新的 Identity table。然后你告诉身份使用上面提到的 SQLPasswordHasher 来尝试匹配旧的 SHA 哈希或(对于已经更新的用户)新式哈希。并且(可选)您可以将新登录用户的哈希更新为新样式。

我已经用几个项目完成了这个,没有一个问题。