因此,我是ASP.NET MVC和EF的新手,我想创建一个“用户类型”,这是指通过在默认身份验证中使用生成的用户的属性来划分用户。
所以这是我的模型课:
public class Student : ApplicationUser
{
[Required]
public string firstName { get; set; }
[Required]
public string lastName { get; set; }
}
如您所见,我继承了默认的ApplicationUser对象,认为我的学生对象是一种学生类型,这是在查看数据库更新后完成的数据库变动后为true的情况:
ALTER TABLE [dbo].[AspNetUsers] ADD [firstName] [nvarchar](max)
ALTER TABLE [dbo].[AspNetUsers] ADD [lastName] [nvarchar](max)
ALTER TABLE [dbo].[AspNetUsers] ADD [Discriminator] [nvarchar](128) NOT NULL DEFAULT ''
如您所见,它添加了我的Student属性,并使用了区分符来区分脚手架并转到localhost / Students之后的常规用户和Student BUT,列表上有所有“ RegularUseer”属性,这是我的屏幕更多细节。
获取:学生成绩的屏幕截图
如您在上图中所看到的,我列出了我的passwordHash和一堆我不想显示的其他属性。
如何正确继承ApplicationUser类? 预先感谢
[编辑]
经过更多研究后,我找到了一种解决方法,可以正确地做到这一点,但是发现它有点笨拙,因此我在项目中的startup.cs文件中添加了一个方法,在此处使用“身份角色”创建角色(用户类型)是的。
public void CreateRoles()
{
ApplicationDbContext context = new ApplicationDbContext();
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
//var userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>(context));
var userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(context));
//Create SuperAdmin Role
if (!roleManager.RoleExists("SuperAdmin"))
{
var role = new IdentityRole("SuperAdmin");
roleManager.Create(role);
context.Roles.Add(role);
var user = new ApplicationUser() { Email = "admin@email.com", UserName = "adminName" };
//userManager.Create<ApplicationUser>(user, "superAdminPassword");
var newuser = userManager.Create(user, "myPassword@123");
if (newuser.Succeeded)
{
userManager.AddToRole(user.Id, "SuperAdmin");
throw new Exception("it succeded");
}
else
{
throw new Exception("Hello World");
}
}
else
{
if(userManager.FindByEmail("admin@email.com") == null)
{
var user = new ApplicationUser() { Email = "admin@email.com", UserName = "adminName" };
var newuser = userManager.Create(user, "myPassword@123");
if(newuser.Succeeded)
{
userManager.AddToRole(user.Id, "SuperAdmin");
context.Users.Add(user);
}
else
{
throw new Exception();
}
}
}
//Create Admin Role
if (!roleManager.RoleExists("Admin"))
{
var role = new IdentityRole("Admin");
roleManager.Create(role);
}
//Create User Role
if (!roleManager.RoleExists("User"))
{
var role = new IdentityRole("User");
roleManager.Create(role);
}
}
我添加了一些用于测试目的的异常,并且可以正常工作,创建了我的角色,并检查了我的表,并且使用SuperAdmin角色创建的用户位于数据库中且具有适当的属性,这里唯一的问题是我可以t通过应用程序登录,显示的错误为“暂时无效”。所以我在这里检查了Login ActionResult:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
// Ceci ne comptabilise pas les échecs de connexion pour le verrouillage du compte
// Pour que les échecs de mot de passe déclenchent le verrouillage du compte, utilisez shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Tentative de connexion non valide.");
return View(model);
}
}
在浏览完此ActionResult之后,我的SignInstatus是SignInStatus。失败,您可以在上面的代码中进行验证,即使我可以看到尝试登录数据库的帐户