[英]ASP.Net MVC5: Efficient method to get list of user in specific role
使用此答案 ,我實現了以下代碼,以獲取特定角色的ApplicationUsers
列表。
我需要提到ApplicationUser是IdentityUser的擴展。 我想知道還有更好的方法嗎?
ApplicationDbContext context = new ApplicationDbContext();
var store = new Microsoft.AspNet.Identity.EntityFramework.UserStore<ApplicationUser>(dbContext);
var manager = new Microsoft.AspNet.Identity.UserManager<ApplicationUser>(store);
List<ApplicationUser> users = new List<ApplicationUser>();
foreach (ApplicationUser user in manager.Users.ToList())
{
if (manager.IsInRole(user.Id,"Admin")){
users.Add(user);
}
}
你可以這樣查詢
ApplicationDbContext context = new ApplicationDbContext();
var role = context.Roles.SingleOrDefault(m => m.Name == "Admin");
var usersInRole = context.Users.Where(m => m.Roles.Any(r => r.RoleId != role.Id));
我不確定這是否是最佳方法,但是對數據庫的查詢少於您的代碼。
不,沒有更好的方法。
但是,假設您在控制器中使用該控件,則可以創建一個BaseController,所有其他控制器都從該控制器派生。
在該BaseController內,您可以實例化ApplicationManager並創建一個方法,該方法可以選擇接收ID(UserId)並返回布爾值。
您可以在控制器中這樣調用:
if(HasRole("Owner")) {} // CurrentUser
if(HasRole(Id, "Owner")) {} // Specific User
還有其他方法,但這是開發人員的選擇。
注意
請記住,如果您選擇靜態實例化ApplicationManager,它將僅運行一次,這可能會執行您不想要的事情,例如將用戶添加到特定角色,以及ApplicationManager除非再次創建,否則不會顯示新角色。 。
我建議以下方法:
public static bool isInRole(IPrincipal User, string roleName, ApplicationDbContext dbContext)
{
try
{
var store = new Microsoft.AspNet.Identity.EntityFramework.UserStore<ApplicationUser>(dbContext);
var manager = new Microsoft.AspNet.Identity.UserManager<ApplicationUser>(store);
return manager.IsInRole(User.Identity.GetUserId(), roleName);
}
catch (Exception ex)
{
return false;
}
return false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.