ASP.Net MVC5:获取特定角色用户列表的有效方法
ASP.Net MVC5: Efficient method to get list of user in specific role
使用 this answer,我实现了以下代码以获取特定角色的 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);
}
}
不,没有更好的方法。
但假设你在你的控制器中使用它,你可以创建一个 BaseController,其中每个其他控制器都派生自。
在该 BaseController 中,您可以实例化 ApplicationManager 并创建一个方法,该方法可选择接收 ID (UserId) 和 returns 布尔值。
您可以像这样在控制器中调用:
if(HasRole("Owner")) {} // CurrentUser
if(HasRole(Id, "Owner")) {} // Specific User
还有其他方法,但这是开发人员的选择。
备注
请记住,如果您选择静态实例化 ApplicationManager,它只会 运行 一次,这可能会执行您不想要的操作,例如将用户添加到特定角色,而 ApplicationManager 不会除非再次创建,否则显示新角色。
您可以这样查询
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));
我不确定这是否是最佳方式,但对数据库的查询比您的代码少。
我建议以下方法:
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;
}
使用 this answer,我实现了以下代码以获取特定角色的 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);
}
}
不,没有更好的方法。
但假设你在你的控制器中使用它,你可以创建一个 BaseController,其中每个其他控制器都派生自。
在该 BaseController 中,您可以实例化 ApplicationManager 并创建一个方法,该方法可选择接收 ID (UserId) 和 returns 布尔值。
您可以像这样在控制器中调用:
if(HasRole("Owner")) {} // CurrentUser
if(HasRole(Id, "Owner")) {} // Specific User
还有其他方法,但这是开发人员的选择。
备注
请记住,如果您选择静态实例化 ApplicationManager,它只会 运行 一次,这可能会执行您不想要的操作,例如将用户添加到特定角色,而 ApplicationManager 不会除非再次创建,否则显示新角色。
您可以这样查询
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));
我不确定这是否是最佳方式,但对数据库的查询比您的代码少。
我建议以下方法:
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;
}