0

각 사용자가 여러 역할을 할 수 있도록 앱을 설정했습니다. 편집 얻는 방법에 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 조건에서 비교할 관리 역할을 찾지 못합니다.

관리자를 편집하기위한 관리자 액세스를 제한하고 새 사용자를 만들 때 관리자의 관리자 역할을 숨기고 사용자에게 역할을 하나만 할당하도록 변경하지 않고도 해결책을 찾을 수 있습니까? 앱의 논리에는 사용자별로 여러 역할이 있어야합니다.

답변

2
는 경우 (! isAdmin) 내부 편집 방법에 코드의 표시된 부분을 이동

: 아무 역할이없는 경우

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); 
     } 
    } 
+0

에서 removeAll가 인식 할 수 없습니다. like : editUser.Roles.RemoveAll(); – Arianit

+0

답변을 업데이트했습니다. – RIanGillis

+0

아직 승인 문제가 있습니다. 당신도 저를 도울 수 있기를 바랍니다 ... 사용자 역할을 설정할 때 관리자 역할을 숨길 부분에 대해서. 나는 당신의 코드를 시도했지만 그것이 효과가 없다고 생각한다. 그럼 실제로는 작동하지만 다른 문제는 후에 발생합니다. 그것은 SelectRoleList에서 admin 역할을 제거하고 편집 할 사용자가 관리 역할을 가지고 있는지 확인하는 경우 절대로 히트하지 않습니다. – Arianit

관련 문제