Как реализовать ASP.NET Identity 2.0 в существующей базе данных?

В настоящее время у меня есть существующее членство, реализованное в проекте веб-форм ASP.NET 4.5. Приложение использует EntityFramework 6.1.3 версия с DbContext и в настоящее время в базе данных первый подход. Я хочу перенести старое членство на новую систему ASP.NET identity 2.0.

Я следовал этой статье для выполнения миграции, но никогда не получалось. Я получил ошибки, как указано в разделе "Требования" типа "AspNetUser" не является свойством навигации.

Это подтверждает, что мне не хватает чего-то базового в процессе миграции.

Может ли кто-нибудь предоставить мне пошаговое руководство по выполнению миграции?

Я хочу обратиться к следующим пунктам:

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.

В соответствии с этим решением я добавил конфигурацию, но в итоге создал новые таблицы для IdentityUserLogin, IdentityRole и т. Д., Которые являются дублирующимися таблицами идентификаторов.

6) Даже если я храню дубликаты таблиц идентификации (например, AspNetUserRoles и IdentityUserRole), я не могу получить данные с использованием кода идентификацииvar user = userManager.FindAsync(UserName.Text, Password.Text); и получить исключение:

Invalid column name 'UserId'

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; }
    }

Эти три точки также разрешают оставшиеся точки.

Другие вопросы по тегам