如何从 SimpleMembership 迁移到 ASP.NET.Identity

How to migrate from SimpleMembership to ASP.NET.Identity

从 MVC4 迁移到 MVC5 并且也想使用 ASP.NET Identity,但我正在努力寻找涵盖我认为迁移 Identity 所需要做的一切的任何内容。 Migrating an Existing Website from SimpleMembership to ASP.NET Identity 建议我需要做的就是创建一个 ApplicationUser 并迁移数据,其他网络搜索会给我 sql 脚本和密码散列建议。但在开始之前,我还想解决其他未解决的问题。

首先 - 我在我的种子方法中有初始化会员系统的代码:

if (!WebSecurity.Initialized)
    WebSecurity.InitializeDatabaseConnection(Config.ConnectionStringName,
        Config.UsersTableName,
        Config.UsersIDColumn,
        Config.UserNameColumn,
        autoCreateTables: true);

所以这需要正确吗?

其次 - 看来我需要 IdentityDbContext。那么我应该更改我现有的上下文以继承它吗?

即而不是我当前的代码 public class SID2013Context : DbContext 这样做:public class SID2013Context : IdentityDbContext<ApplicationUser>

这会生成一个迁移来创建我需要支持的新表 ASP.NET 身份吗?[=​​18=]

完成后,我应该能够引入 AccountController、视图、ViewModel 并启动为 MVC5 项目生成的代码。

谁能回答这里的具体问题and/or给我指点更好的资源?

我意识到我在问题中链接到的网站告诉您如何迁移到 Identity 表,但仍然使用 SimpleMembership。我想始终使用 Identity,所以我使用 Visual Studio 创建了一个空的 MVC 应用程序,这样我就可以复制我想要的代码并修复它。以下是我为使登录和注销正常工作所遵循的步骤:

  1. 已将 ApplicationUser.cs 添加到我的模型项目
  2. 已将 IdentityConfig.cs 添加到我的 App_Start 文件夹
  3. 已将 Startup.Auth.cs 添加到我的 App_Start 文件夹
  4. 已将 AccountController.cs 添加到我的控制器文件夹(重命名现有控制器)
  5. 已将 Startup.cs 添加到根文件夹
  6. 已将 AccountViewModels.cs 添加到 ViewModels 文件夹
  7. 更改了我的上下文以继承 IdentityDbContext(这确实意味着在迁移中创建了新表)
  8. 添加了所需的 NuGet 包并修复了所有命名空间
  9. 项目正在构建
  10. 但是Add-Migration报错了..."EntityType IdentityUserRole has no key defined"
  11. ...通过在我的覆盖
  12. 中添加对 base.OnModelCreating 的调用解决了这个问题
  13. Add-Migration & Update-Database - 添加所需的表格
  14. 将我在 UserProfile 中的自定义字段添加到 ApplicationUser 并更新了数据库
  15. 使用 sql(在迁移中)将数据从旧表复制到新表。 Sql 包括在这里。 NB 需要使用 Guid 填充 SecurityStamp 以防止在登录期间出错
  16. 登录和注销正常工作
  17. 删除了 UserProfileSimpleRoleProviderRoleManager 类 - 在必要时替换了代码。
  18. 删除了对 WebMatrix.DataWebMatrix.WebData dll 的引用
  19. 从 web.config
  20. 中删除了 <roleManager enabled="true" defaultProvider="simple"><membership defaultProvider="simple">

Sql在第14步中使用:

INSERT INTO dbo.aspnetusers (id
, email
, emailconfirmed
, passwordhash
, securitystamp
, phonenumber
, phonenumberconfirmed
, twofactorenabled
, lockoutenddateutc
, lockoutenabled
, accessfailedcount
, username
, organisationid
, firstname
, lastname
, inactive)
    SELECT
        u.id,
        u.username Email,
        m.isconfirmed EmailConfirmed,
        m.password PasswordHash,
        --SignInManager.PasswordSignInAsync (used in Login method) 
        --throws an exception 
        NEWID() SecurityStamp, 
        u.telephone PhoneNumber,
        CASE
            WHEN u.telephone IS NULL THEN 0
            ELSE 1
        END PhoneNumberConfirmed,
        0 TwoFactorEnabled,
        NULL LockoutEndDateUtc,
        0 LockoutEnabled,
        m.passwordfailuressincelastsuccess AccessFailedCount,
        u.username,
        u.organisationid,
        u.firstname,
        u.lastname,
        u.inactive
    FROM dbo.userprofiles u
        INNER JOIN dbo.webpages_membership m
            ON m.userid = u.id
    WHERE NOT EXISTS (SELECT
        1
    FROM dbo.aspnetusers
    WHERE id = u.id)

INSERT INTO dbo.aspnetroles (id
, name)
    SELECT
        roleid,
        rolename
    FROM dbo.webpages_roles r
    WHERE NOT EXISTS (SELECT
        1
    FROM dbo.aspnetroles
    WHERE roleid = r.roleid)

 INSERT INTO dbo.aspnetuserroles (userid
    , roleid)
        SELECT
            userid,
            roleid
        FROM dbo.webpages_usersinroles ur
        WHERE NOT EXISTS (SELECT
            1
        FROM dbo.aspnetuserroles
        WHERE userid = ur.userid
        AND roleid = ur.roleid)