簡體   English   中英

ASP.Net MVC5:一種獲得特定角色用戶列表的有效方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM