【问题标题】:How to migrate from SimpleMembership to ASP.NET.Identity如何从 SimpleMembership 迁移到 ASP.NET.Identity
【发布时间】:2015-08-12 13:38:26
【问题描述】:

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

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

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 Identity 的新表吗?

完成后,我应该能够提取 AccountController、视图、视图模型并启动为 MVC5 项目生成的代码。

谁能在这里回答具体问题和/或向我指出更好的资源?

【问题讨论】:

标签: asp.net-mvc-4 asp.net-mvc-5 asp.net-identity simplemembership


【解决方案1】:

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

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

第14步使用的Sql:

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 http://stackoverflow.com/a/23354148/150342
        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)

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 2018-03-12
    • 2012-08-27
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2021-07-18
    相关资源
    最近更新 更多