Я начинаю работать в ASP.NET, и я пытаюсь создать пользовательскую систему, используя структуру Identity в проекте ASP.NET-MVC.Usermanager с моделью, унаследованной от applicationUser
Я хочу иметь «Администратор» пользовательский объект наследует от базового объекта «applicationUser», который создается по умолчанию в моей модели (с моими небольшими изменениями):
public class ApplicationUser : IdentityUser
{
[Required]
[StringLength(50)]
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Required]
[StringLength(50, ErrorMessage = "First name cannot be longer than 50 characters.")]
[Column("FirstName")]
[Display(Name = "First Name")]
public string FirstMidName { get; set; }
[Display(Name = "Full Name")]
public string FullName
{
get
{
return LastName + ", " + FirstMidName;
}
}
}
public class Admin: ApplicationUser
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int AdID;
}
Я также добавить 2 другие наследство от applicationUser, я хочу, чтобы отдельные модели для разных пользователей хранили различную информацию в своих файлах базы данных и позволяли им входить на мой сайт.
В запуске Я пытаюсь сначала добавить администратора пользователя, используя этот код (взято где-то в StackOverflow ответы):
public static async Task CreateRoles(SchoolContext context, IServiceProvider serviceProvider)
{
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
// First, Creating User role as each role in User Manager
List<IdentityRole> roles = new List<IdentityRole>();
roles.Add(new IdentityRole { Name = "Student", NormalizedName = "STUDENT" });
roles.Add(new IdentityRole { Name = "ADMIN", NormalizedName = "ADMINISTRATOR" });
roles.Add(new IdentityRole { Name = "Professor", NormalizedName = "PROFESSOR" });
//Then, the machine added Default User as the Admin user role
foreach (var role in roles)
{
var roleExit = await roleManager.RoleExistsAsync(role.Name);
if (!roleExit)
{
context.Roles.Add(role);
context.SaveChanges();
}
}
await CreateUser(context, userManager);
}
private static async Task CreateUser(SchoolContext context, UserManager<ApplicationUser> userManager)
{
var adminUser = await userManager.FindByEmailAsync("[email protected]");
if (adminUser != null)
{
if (!(await userManager.IsInRoleAsync(adminUser, "ADMINISTRATOR")))
await userManager.AddToRoleAsync(adminUser, "ADMINISTRATOR");
}
else
{
var newAdmin = new applicationUser()
{
UserName = "[email protected]",
Email = "[email protected]",
LastName = "Admin",
FirstMidName = "Admin",
};
var result = await userManager.CreateAsync(newAdmin, "password123;");
if (!result.Succeeded)
{
var exceptionText = result.Errors.Aggregate("User Creation Failed
- Identity Exception. Errors were: \n\r\n\r",
(current, error) => current + (" - " + error + "\n\r"));
throw new Exception(exceptionText);
}
await userManager.AddToRoleAsync(newAdmin, "ADMINISTRATOR");
}
}
Но когда я пытаюсь сделать это, я получаю исключение: «Не удается вставить значение NULL в столбце «Дискриминатор», таблица «aspnet-University», столбец не допускает нулей. INSERT не работает. Заявление прекращено ».
Если я пытаюсь изменить переменную типа Admin на «новый Admin» вместо «new applicationUser», я получаю другое исключение: Тип сущности «Admin» не найден. Убедитесь, что тип объекта добавлен в модель.
Я знаю, что этот вопрос касается основ системы идентификации; Я пока не понимаю их; Я только начал понимать, что это prinicples, и я не знаю, как справиться с моей проблемой.
Мое предположение, что мне нужно создать новый UserManager, который сможет манипулировать экземплярами, которые наследуют базовую модель приложения. Я буду рад, если вы порекомендуете мне соответствующие ресурсы по этой теме и поможете мне решить мою проблему.