0

各ユーザーに複数の役割を許可するように設定しました。管理者ロールを持つユーザーを拒否して管理者の役割を持つユーザーを編集するAsp.Net MVC5 ID

Controllesで今
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; 
    } 

を書いた方法を取得し、管理者がユーザーを編集するには、それらを作成する権利を持っていますが、管理者が持つユーザーを作成することはできません。管理者ロール。 私がやっていることは、管理者が管理者を編集するためのアクセスを拒否することです。 私が書いたコードでは、ユーザー役割のリスト全体が必要であり、管理者ロールが存在するため、ユーザーの編集アクセスは常に拒否されます。 これは私が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条件で比較する管理者ロールが見つかりません。

新しいユーザーを作成するときに、管理ユーザーを編集するための管理者アクセスを制限し、管理者の管理者ロールを非表示にする解決策をユーザーに教えてもらえますか?アプリのロジックは、ユーザーごとに複数の役割を持つ必要があります。

答えて

2
IF(isAdmin!)内部編集方法コードの指示部を移動

:NOロールがない場合

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

関連する問題