如何在现有数据库中实现 ASP.NET Identity 2.0?
Posted
技术标签:
【中文标题】如何在现有数据库中实现 ASP.NET Identity 2.0?【英文标题】:How to implement ASP.NET Identity 2.0 in existing database? 【发布时间】:2015-07-21 18:51:24 【问题描述】:我目前在 ASP.NET 4.5 Web 表单项目中实现了现有成员资格。该应用程序使用带有DbContext
的EntityFramework 6.1.3
版本,目前采用数据库优先方法。我想迁移旧成员以使用新的 ASP.NET 身份 2.0 系统。
我已关注this article 执行迁移,但从未成功。我收到了The property 'Claims' on type 'AspNetUser' is not a navigation property 中提到的错误。
它确认我在迁移过程中遗漏了一些基本的东西。
谁能为我提供执行成功迁移的分步指南?
我想说明以下几点:
1) 在身份方面,除了默认身份提供的内容之外,我还有一些额外的用户数据。我看到有一个IdentityContext
执行这些身份操作。我有一个从DbContext
继承的不同上下文。我需要同时使用这两个上下文吗?换句话说IdentityContext
是身份操作的强制要求?这两个上下文不能合二为一吗?
2) 我不限于使用数据库优先方法。由于身份使用代码优先方法,我可以继续使用代码优先方法,但需要正确的步骤来跟进。
3) 由于我有额外的用户数据,所以我需要扩展IdentityUser
以添加新属性?如果我将扩展IdentityUser
,身份代码会无缝工作吗?
4) 我关注了https://www.youtube.com/watch?v=blmkPA7XQf8 视频教程,它在ApplicationDbContext
中添加了迁移。 ApplicationDbContext 继承 IdentityContext
。它对我有用,但我想为我自己的继承自 DbContext 的上下文添加迁移。这是因为 ApplicationDbContext 不包含其他表(非标识表)。
5) 我尝试在包含所有身份和非身份表的自定义 Context.cs
文件中应用迁移。我按照this article 中的建议使用EntityFramework Power Tools 的逆向工程方法创建了这个类。
创建 POCO 类后,我添加了迁移并更新了数据库。我得到的主要错误是:
IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined.
IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.
根据这个解决方案,我添加了配置,但最终为 IdentityUserLogin、IdentityRole 等创建了新表,这些表是重复的身份表。
6) 即使我保留了重复的身份表(例如 AspNetUserRoles 和 IdentityUserRole),我也无法使用身份代码获取数据
var user = userManager.FindAsync(UserName.Text, Password.Text);
并得到异常:
Invalid column name 'UserId'
【问题讨论】:
我明白了,这是一篇旧帖子,但是,你见过this tutorial 吗?也请看this post。 【参考方案1】:1) 在身份方面,我有一些额外的用户数据,而不是默认数据 身份提供。我看到有一个 IdentityContext 这些身份操作。我有一个不同的上下文继承 来自 DbContext。我需要同时使用这两个上下文吗?换一种说法 IdentityContext对于身份操作是强制性的吗?不能这两个 上下文合并为一个?
是的,当首先使用数据库实现 ASP.NET 标识时,您需要使用两个上下文。 Asp.Net 身份使用 System.Data.SqlClient
提供者,而 Edmx 使用 System.Data.EntityClient
provider。
2) 我不限于使用数据库优先方法。既然身份 使用代码优先的方法我可以继续使用代码优先 方法,但需要正确的步骤来跟进。
在代码优先方法中很容易实现,即使 ASP.NET MVC 默认模板通过代码优先方法提供了 ASp.NET 标识的实现,但使用数据库优先方法也没有问题。 https://danieleagle.com/2014/05/setting-up-asp-net-identity-framework-2-0-with-database-first-vs2013-update-2-spa-template/
3) 由于我有额外的用户数据,所以我需要扩展 IdentityUser 添加新属性?如果我将扩展 IdentityUser 将 身份代码可以无缝工作吗?
是的,你可以扩展它。当你想用任何附加属性扩展User.Identity
的属性时,首先将这些属性添加到ApplicationUser
类中,如下所示:
public class ApplicationUser : IdentityUser
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
//Extended properties
public string City get; set;
这三个点也可以解决剩余的点。
【讨论】:
以上是关于如何在现有数据库中实现 ASP.NET Identity 2.0?的主要内容,如果未能解决你的问题,请参考以下文章