如何在现有数据库中实现 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.EntityClientprovider。

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?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC 5 中实现自定义身份验证

如何在 ASP.NET Core 2.2 中实现标识

您将如何在 asp.net mvc 中实现面包屑助手?

如何在现实生活中实现业务逻辑层的良好实践asp.net

如何在 ASP.NET 中实现支付网关 [关闭]

如何使用 ASP.NET MVC 在 Kendo UI Grid 中实现 N 级嵌套层次结构