如何继承asp.net ApplicationUser类以创建“用户类型”或角色?

时间:2019-01-17 15:04:04

标签: c# asp.net asp.net-mvc entity-framework inheritance

因此,我是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”属性,这是我的屏幕更多细节。

获取:学生成绩的屏幕截图

enter image description here

如您在上图中所看到的,我列出了我的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。失败,您可以在上面的代码中进行验证,即使我可以看到尝试登录数据库的帐户

0 个答案:

没有答案