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

时间:2015-05-11 10:03:54

标签: c# asp.net entity-framework asp.net-membership asp.net-identity-2

我目前在ASP.NET 4.5 Web表单项目中实现了现有成员身份。该应用程序使用带有6.1.3的EntityFramework DbContext版本,目前采用数据库第一种方法。我想迁移旧成员资格以使用新的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文件中应用迁移,该文件包含所有身份和非身份表。我按照EntityFramework Power Tools中建议的this article使用逆向工程方法创建了这个类。

创建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'

1 个答案:

答案 0 :(得分:1)

  

1)在身份方面,我有一些额外的用户数据,而不是默认值   身份正在提供。我看到有一个IdentityContext   这些身份操作。我有一个继承的不同上下文   来自DbContext。我是否需要同时使用这两种情况?换一种说法   IdentityContext是身份操作的必要条件吗?不能这两个   上下文合并为一个?

是的,当首先使用Database实现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; }
    }

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