Как реализовать 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; }
}
Эти три точки также разрешают оставшиеся точки.