ASP.Net MVC5:获取特定角色的用户列表的有效方法

本文关键字:用户 列表 有效 方法 定角色 Net MVC5 获取 ASP | 更新日期: 2023-09-27 18:37:17

使用这个答案,我实现了以下代码来获取特定角色中的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);
    }
}

ASP.Net MVC5:获取特定角色的用户列表的有效方法

你可以像这样查询

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 中,您可以实例化应用程序管理器并创建一个方法,该方法可以选择接收 ID (UserId) 并返回布尔值。

您可以像这样在控制器中调用它:

if(HasRole("Owner")) {} // CurrentUser
if(HasRole(Id, "Owner")) {} // Specific User

还有其他方法,但这是开发人员的选择。

注意

请记住,如果您选择静态实例化应用程序管理器,它将只运行一次,这可能会执行您不希望的操作,例如将用户添加到特定角色,并且应用程序管理器不显示新角色,除非再次创建它。

我建议使用以下方法:

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;
}