각 사용자가 여러 역할을 할 수 있도록 앱을 설정했습니다. 편집 얻는 방법에 Controlles 지금 관리자 역할을 가진 사용자를 거부하여 관리자 역할을 가진 사용자를 거부합니다. Asp.Net MVC5 ID
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; }
}
, 나는이
[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;
}
그래서, 관리자가 사용자를 편집하고이를 만들 수있는 권한을 가지고 썼습니다 만, 관리자가 사용자에게 만들 수 없습니다 관리 역할. 내가하려는 것은 관리자가 관리자를 편집 할 수있는 권한을 거부하는 것입니다. 내가 작성한 코드에는 사용자 역할의 전체 목록이 필요하며 관리 역할이 있으므로 사용자 편집 권한이 항상 거부됩니다. 관리자가 여전히 있기 때문에 관리자의 사용자를 편집 할 수 있도록
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);
}
}
과 (주석)이 코드
, 그것은 완전히 목록에서 관리자 역할을 제거 : 나는 GetEditUser 방법이 코드를 주석 때 발생합니다 if 조건에서 비교할 관리 역할을 찾지 못합니다.관리자를 편집하기위한 관리자 액세스를 제한하고 새 사용자를 만들 때 관리자의 관리자 역할을 숨기고 사용자에게 역할을 하나만 할당하도록 변경하지 않고도 해결책을 찾을 수 있습니까? 앱의 논리에는 사용자별로 여러 역할이 있어야합니다.
에서 removeAll가 인식 할 수 없습니다. like : editUser.Roles.RemoveAll(); – Arianit
답변을 업데이트했습니다. – RIanGillis
아직 승인 문제가 있습니다. 당신도 저를 도울 수 있기를 바랍니다 ... 사용자 역할을 설정할 때 관리자 역할을 숨길 부분에 대해서. 나는 당신의 코드를 시도했지만 그것이 효과가 없다고 생각한다. 그럼 실제로는 작동하지만 다른 문제는 후에 발생합니다. 그것은 SelectRoleList에서 admin 역할을 제거하고 편집 할 사용자가 관리 역할을 가지고 있는지 확인하는 경우 절대로 히트하지 않습니다. – Arianit