【问题标题】:Deny user with manager role to edit users with admin role Asp.Net MVC5 Identity拒绝具有管理员角色的用户编辑具有管理员角色的用户 Asp.Net MVC5 Identity
【发布时间】:2016-12-17 02:47:41
【问题描述】:

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

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; }
}

现在在 Controlles 中,在我写的 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 条件中找不到要比较的管理员角色。

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

【问题讨论】:

    标签: asp.net-mvc entity-framework-6 authorization asp.net-identity asp.net-roles


    【解决方案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);
            }
        }
    

    【讨论】:

    • RemoveAll 如果没有角色则无法识别。比如:editUser.Roles.RemoveAll();
    • 授权还是有问题。希望你也能帮助我...关于在为用户设置角色时隐藏管理员角色的部分。我试过你的代码,但我认为它不起作用。好吧,它实际上有效,但之后还有其他一些问题。它从 SelectRoleList 中删除了管理员角色,并且它从不点击 if 它检查要编辑的用户是否具有管理员角色
    • 如果if (editUser.Roles.Exists(x =&gt; x.RoleName == "Admin")) 再次出现问题是,对于用户,它会获得存储在 SelectRoleViewModel 中的整个 RoleList,而不仅仅是分配给用户的 RoleList。必须在哪里进行 if 语句来检查角色 admin 是否被选中(true)。
    • 为 x.Checked == true 添加检查。
    • 它现在工作。希望以后不会出现问题。谢谢
    猜你喜欢
    • 2012-10-09
    • 2014-09-16
    • 2018-04-29
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多