【发布时间】: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