Как реализовать ASP.NET Identity 2.0 в существующей базе данных?
В настоящее время у меня есть существующее членство, реализованное в проекте веб-форм ASP.NET 4.5. Приложение использует версию EntityFramework 6.1.3
с DbContext
и в настоящее время в первом подходе базы данных. Я хочу перенести старое членство, чтобы использовать новую систему идентификации ASP.NET 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; }
}
Эти три точки также разрешают остальные точки.