为用户分配角色会导致在数据库中创建新角色

时间:2016-12-20 01:59:19

标签: c# asp.net asp.net-mvc

我有这个

  [HttpPost, ValidateAntiForgeryToken]
    public ActionResult Create(UserNew form)
    {
        var user = new User();
        SyncRoles(form.Roles, user.Roles);

        if (db.Users.Any(u => u.username == form.username))
        {
            ModelState.AddModelError("Username", "Username must be unique");
        }

        if (ModelState.IsValid)
        {
            user.username = form.username;
            user.email = form.email;                 
            user.SetPassword(form.password);

            db.Users.Add(user);
            db.SaveChanges();

            return RedirectToAction("Index");
        }

        return View(form);
    }

并且使用此函数我试图在表单中检查哪些复选框并将选中的角色分配给用户:

 private void SyncRoles(IList<RoleCheckbox> checkboxes, IList<Role> roles)
    {
        var selectedRoles = new List<Role>();
        RolesContext rdb = new RolesContext();


        List <Role> roleList = new List<Role>();
        roleList = rdb.Roles.ToList();


        foreach (var role in roleList)
        {
            var checkbox = checkboxes.Single(c => c.roleId == role.roleId);
            checkbox.roleName = role.roleName;

            if (checkbox.IsChecked)
                selectedRoles.Add(role);
        }
        foreach (var toAdd in selectedRoles.Where(t => !roles.Contains(t)))
        {
            roles.Add(toAdd);
        }
        foreach (var toRemove in roles.Where(t => !selectedRoles.Contains(t)).ToList())
        {
            roles.Remove(toRemove);
        }
    }

当我尝试创建用户时,我选择角色“admin”(已存在于id = 1的数据库中),在数据库中我在Roles表中获得一个名为“admin”的新字段但是ID不同。 有人能帮助我理解我做错了什么吗?

public class User
{
    [HiddenInput(DisplayValue = false)]
    public int userId { get; set; }

    [Required]
    [StringLength(128)]
    public string username { get; set; }

    [Required, DataType(DataType.EmailAddress)]
    [StringLength(256)]
    public string email { get; set; }

    [Required]
    [StringLength(128)]
    public string password_hash { get; set; }

    public virtual IList<Role> Roles { get; set; }

    public User()
    {
        Roles = new List<Role>();
    }

    public void SetPassword(string password)
    {
        password_hash = BCrypt.Net.BCrypt.HashPassword(password, 14);
    }
    public virtual bool CheckPassword(string password)
    {
        return BCrypt.Net.BCrypt.Verify(password, password_hash);
    }        
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .Property(e => e.username)
            .IsUnicode(false);

        modelBuilder.Entity<User>()
            .Property(e => e.email)
            .IsUnicode(false);

        modelBuilder.Entity<User>()
            .Property(e => e.password_hash)
            .IsUnicode(false);

        modelBuilder.Entity<User>().HasMany(r => r.Roles).WithMany().Map(m =>
               {
                   m.ToTable("role_users");
                   m.MapLeftKey("user_Id");
                   m.MapRightKey("role_Id");
               });
    }

1 个答案:

答案 0 :(得分:0)

我想添加一条评论,但只有在50多个声望之后才有可能。从我在您的代码中看到的内容,您可以从MVC为用户分配角色,并且您将直接发送到EF,这将导致您在数据库中重复。您应该更改逻辑,在成功创建用户后,您应该使用UserManager类将用户添加到角色:

UserManager.AddToRole(user.Id, role.Name);

根据数据库检查角色。如果您未在数据库中找到角色,则应使用IdentityRol e class

创建角色