拒绝具有管理员角色的用户编辑具有管理员角色的用户 Asp.Net MVC5 身份

Deny user with manager role to edit users with admin role Asp.Net MVC5 Identity

我已将应用设置为允许每个用户拥有多个角色。

public class SelectRoleViewModel
{      
    public string Id { get; set; }
    public bool Checked { get; set; }        
    public string RoleName { get; set; }
    public string Description { get; set; }
}

public class EditUser
{
   // other properties

  public List<SelectRoleViewModel> Roles { get; set; }
}

现在在控件中,我在 Edit get 方法中写了这个

[CustomAuthorize(Roles = ("Admin,Manager"))]
    public ActionResult Edit(string Id)
    {
        var editUser = GetEditUser(Id);

        bool isAdmin = User.IsInRole("Admin");

        if (!isAdmin)
        {      
            if (editUser.Roles.Exists(x => x.RoleName == "Admin"))
            {
                return RedirectToAction("AccessNotAllowed", "Errors");
            }
        }

        // Here just edit what you want
        return View(editUser);                        
    }

private EditUser GetEditUser(string Id)
    {
        var dbUser = UserManager.Users.Where(x => x.Id == Id).FirstOrDefault();
        var currentRoles = dbUser.Roles.Select(x => x.RoleId).ToList();
        var allRoles = _roleManager.Roles.ToList();

        EditUser editUser = new EditUser();
        foreach (var x in allRoles)
        {
            if (currentRoles.Contains(x.Id))
                editUser.Roles.Add(new SelectRoleViewModel { Id = x.Id, RoleName = x.Name, Description = x.Description, Checked = true });
            else
                editUser.Roles.Add(new SelectRoleViewModel { Id = x.Id, RoleName = x.Name, Description = x.Description, Checked = false });
        }

        if (User.IsInRole("Manager"))
        {
            // don't show the admin role to set for users if authenticated user is manager
            var adm = editUser.Roles
                        .Where(x => x.RoleName.Equals("Admin", StringComparison.OrdinalIgnoreCase))
                        .FirstOrDefault();
            if (adm != null)
            {
                editUser.Roles.Remove(adm);
            }
        }

        editUser.FirstName = dbUser.FirstName;
        editUser.LastName = dbUser.LastName;
        editUser.Email = dbUser.Email;
        editUser.UserName = dbUser.UserName;
        editUser.Id = dbUser.Id;
        return editUser;
    }

因此,管理员有权编辑和创建用户,但管理员不能创建具有管理员角色的用户。 我想做的是拒绝经理访问编辑管理员用户。 我写的代码,它占用了整个用户角色列表,并且由于有管理员角色,它总是拒绝编辑用户的访问权限。 当我在 GetEditUser 方法中注释掉这段代码时会发生这种情况:

if (User.IsInRole("Manager"))
        {
            // don't show the admin role to set for users if authenticated user is manager
            var adm = editUser.Roles
                        .Where(x => x.RoleName.Equals("Admin", StringComparison.OrdinalIgnoreCase))
                        .FirstOrDefault();
            if (adm != null)
            {
                editUser.Roles.Remove(adm);
            }
        }

使用这段代码(未注释),它完全从列表中删除了管理员角色,因此经理仍然可以编辑管理员用户,因为它在 if 条件下找不到要比较的管理员角色。

有人可以帮我找到一个解决方案来限制经理对编辑管理员用户的访问权限,并在创建新用户时隐藏经理的管理员角色,而无需将用户更改为仅分配 1 个角色吗?应用程序的逻辑需要每个用户有多个角色。

将指示的代码部分移动到 if(!isAdmin):

中的 Edit 方法
    if (!isAdmin)
    {      
        if (editUser.Roles.Exists(x => x.RoleName == "Admin" && x.Checked))
        {
            return RedirectToAction("AccessNotAllowed", "Errors");
        }
        var adm = editUser.Roles
                    .Where(x => x.RoleName.Equals("Admin", StringComparison.OrdinalIgnoreCase))
                    .FirstOrDefault();
        if (adm != null)
        {
            editUser.Roles.Remove(adm);
        }
    }