如何在现有数据库中实现ASP.NET Identity 2.0?

Duk*_*hoo 11 c# asp.net entity-framework asp.net-membership asp.net-identity-2

我目前在ASP.NET 4.5 Web表单项目中实现了现有成员身份.该应用程序使用EntityFramework 6.1.3版本,DbContext当前采用数据库第一种方法.我想迁移旧成员资格以使用新的ASP.NET身份2.0系统.

我已经按照本文执行迁移但从未成功过.我收到了'AspNetUser'类型的属性'Claims'中提到的错误不是导航属性.

它证实了我在迁移过程中遗漏了一些基本内容.

有人可以为我提供逐步指导以执行成功迁移吗?

我想谈谈以下几点:

1)在身份方面,我有一些额外的用户数据,而不是默认身份提供的数据.我看到有一个IdentityContext做这些身份操作.我有一个继承自的不同背景DbContext.我是否需要同时使用这两种情况?换句话说IdentityContext,身份操作是强制性的吗?这两个上下文不能合并成一个吗?

2)我不仅限于数据库第一种方法.由于身份使用代码第一种方法,我可以继续使用代码优先方法,但需要正确的步骤来跟进.

3)因为我有额外的用户数据所以我需要扩展IdentityUser以添加新属性?如果我将扩展IdentityUser遗嘱身份代码无缝地工作?

4)我按照https://www.youtube.com/watch?v=blmkPA7XQf8视频教程添加了迁移ApplicationDbContext.ApplicationDbContext继承IdentityContext.它对我有用,但我想为我自己的上下文添加迁移,该上下文继承自DbContext.这是因为ApplicationDbContext不包含其他表(非标识表).

5)我尝试在我的自定义Context.cs文件中应用迁移,该文件包含所有身份和非身份表.我使用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.
Run Code Online (Sandbox Code Playgroud)

根据这个解决方案,我添加了配置,但最终为IdentityUserLogin,IdentityRole等创建了新表,这些表是重复的身份表.

6)即使我保留了重复的身份表(例如AspNetUserRoles和IdentityUserRole),我也无法使用身份代码获取数据 var user = userManager.FindAsync(UserName.Text, Password.Text);并获得异常:

Invalid column name 'UserId'
Run Code Online (Sandbox Code Playgroud)

San*_*wat 1

1)在身份方面,除了默认身份提供的数据之外,我还有一些额外的用户数据。我看到有一个 IdentityContext 执行这些身份操作。我有一个继承自 DbContext 的不同上下文。我需要使用这两个上下文吗?换句话说,IdentityContext对于身份操作是必需的?这两个上下文不能合二为一吗?

是的,当首先使用数据库实现 ASP.NET 身份时,您需要使用两个上下文。Asp.Net 身份使用System.Data.SqlClient提供程序,而 Edmx 使用System.Data.EntityClient提供程序。

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; }
    }
Run Code Online (Sandbox Code Playgroud)

这三点也解决了剩下的问题。