各ユーザーに複数の役割を許可するように設定しました。管理者ロールを持つユーザーを拒否して管理者の役割を持つユーザーを編集する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条件で比較する管理者ロールが見つかりません。
新しいユーザーを作成するときに、管理ユーザーを編集するための管理者アクセスを制限し、管理者の管理者ロールを非表示にする解決策をユーザーに教えてもらえますか?アプリのロジックは、ユーザーごとに複数の役割を持つ必要があります。
REMOVEALLは認識できません。 like:editUser.Roles.RemoveAll(); – Arianit
私は答えを更新しました – RIanGillis
まだ許可の問題があります。それについても私を助けてくれることを願っています...ユーザーの役割を設定するときにマネージャの管理者ロールを隠す部分について。あなたのコードを試しましたが、うまくいかないと思います。それは実際には動作しますが、後にいくつかの問題があります。それはSelectRoleListからadminロールを削除し、編集するユーザが管理ロールを持っているかどうかをチェックすると、決してヒットしません – Arianit