如何从 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 应用程序,这样我就可以复制我想要的代码并修复它。以下是我为使登录和注销正常工作所遵循的步骤:
- 已将
ApplicationUser.cs
添加到我的模型项目
- 已将
IdentityConfig.cs
添加到我的 App_Start 文件夹
- 已将
Startup.Auth.cs
添加到我的 App_Start 文件夹
- 已将
AccountController.cs
添加到我的控制器文件夹(重命名现有控制器)
- 已将
Startup.cs
添加到根文件夹
- 已将
AccountViewModels.cs
添加到 ViewModels 文件夹
- 更改了我的上下文以继承
IdentityDbContext
(这确实意味着在迁移中创建了新表)
- 添加了所需的 NuGet 包并修复了所有命名空间
- 项目正在构建
- 但是
Add-Migration
报错了..."EntityType IdentityUserRole has no key defined"
- ...通过在我的覆盖
中添加对 base.OnModelCreating
的调用解决了这个问题
Add-Migration
& Update-Database
- 添加所需的表格
- 将我在
UserProfile
中的自定义字段添加到 ApplicationUser
并更新了数据库
- 使用 sql(在迁移中)将数据从旧表复制到新表。 Sql 包括在这里。 NB 需要使用 Guid 填充
SecurityStamp
以防止在登录期间出错
- 登录和注销正常工作
- 删除了
UserProfile
、SimpleRoleProvider
和 RoleManager
类 - 在必要时替换了代码。
- 删除了对
WebMatrix.Data
和 WebMatrix.WebData
dll 的引用
- 从 web.config
中删除了 <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)
从 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 应用程序,这样我就可以复制我想要的代码并修复它。以下是我为使登录和注销正常工作所遵循的步骤:
- 已将
ApplicationUser.cs
添加到我的模型项目 - 已将
IdentityConfig.cs
添加到我的 App_Start 文件夹 - 已将
Startup.Auth.cs
添加到我的 App_Start 文件夹 - 已将
AccountController.cs
添加到我的控制器文件夹(重命名现有控制器) - 已将
Startup.cs
添加到根文件夹 - 已将
AccountViewModels.cs
添加到 ViewModels 文件夹 - 更改了我的上下文以继承
IdentityDbContext
(这确实意味着在迁移中创建了新表) - 添加了所需的 NuGet 包并修复了所有命名空间
- 项目正在构建
- 但是
Add-Migration
报错了..."EntityType IdentityUserRole has no key defined" - ...通过在我的覆盖 中添加对
Add-Migration
&Update-Database
- 添加所需的表格- 将我在
UserProfile
中的自定义字段添加到ApplicationUser
并更新了数据库 - 使用 sql(在迁移中)将数据从旧表复制到新表。 Sql 包括在这里。 NB 需要使用 Guid 填充
SecurityStamp
以防止在登录期间出错 - 登录和注销正常工作
- 删除了
UserProfile
、SimpleRoleProvider
和RoleManager
类 - 在必要时替换了代码。 - 删除了对
WebMatrix.Data
和WebMatrix.WebData
dll 的引用 - 从 web.config 中删除了
base.OnModelCreating
的调用解决了这个问题
<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)