【问题标题】:error with getting all users in role让所有用户担任角色时出错
【发布时间】:2015-11-18 02:11:16
【问题描述】:

我正在尝试获取一个角色中所有用户的列表,尽管我在这里阅读了许多问题和链接,但我似乎无法弄清楚这个身份的东西。以下是我目前正在使用的内容:

IdentityRole role = context.Roles.Where(x => x.Name == rolesDDL.SelectedValue).First();
var users = context.Users.Where(x => x.Roles.Any(r => r.RoleId == role.Id));

但是,这会在角色行上显示“序列不包含元素”的错误。我尝试使用 UserManager/RoleManager 执行类似的代码,但结果相同:

var userManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
var roleManager = Request.GetOwinContext().GetUserManager<ApplicationRoleManager>();

IdentityRole role = roleManager.Roles.Where(x => x.Name == rolesDDL.SelectedValue).First();
var users = userManager.Users.Where(x => x.Roles.Any(r => r.RoleId == role.Id));

编辑:这似乎是 RoleManager 无法真正找到我的角色的问题。如果我进入 ServerExplorer,我可以在我的 AspNetRoles 表中看到角色,但是在从 OWIN 上下文实例化我的 RoleManager 之后,它似乎仍然没有任何角色。这可能是为数据安装 RavenDB 的问题吗?我也看到了如何将用户迁移到 Raven,但我希望先让它使用默认值,然后再为自己解决更多问题。

这是我目前在这个函数中拥有的:

var userManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
var roleManager = Request.GetOwinContext().GetUserManager<ApplicationRoleManager>();

//IdentityRole role = roleManager.Roles.Where(x => x.Name == rolesDDL.SelectedValue).First();
//var users = userManager.Users.Where(x => x.Roles.Any(r => r.RoleId == role. 

//IdentityRole role = context.Roles.Where(x => x.Name == rolesDDL.SelectedValue).First();
//var users = context.Users.Where(x => x.Roles.Any(r => r.RoleId == role.Id));

var users = roleManager.FindByName(rolesDDL.SelectedItem.Text).Users;

编辑:为每个请求添加初始化程序,在 startup.auth.cs 中找到:

app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

【问题讨论】:

  • 你有一个很好的错误。去调试吧。我猜错误可能是 context.Roles 没有元素或 rolesDDL.SelectedValue 没有元素。检查他们两个,然后你就会知道你的下一步,或者可以问另一个问题。
  • 我从星期五开始写这篇文章,今天上午完成了。哎呀。 RolesDDL 填充角色,所以我知道它们存在于数据库中。我在那里使用相同的上下文来获取角色。

标签: c# asp.net webforms roles asp.net-identity-2


【解决方案1】:

如果您改用 roleManager 并使用角色名称而不是角色 ID 对其进行过滤,您可以使用以下内容:

var roleManager = HttpContext.Current
        .GetOwinContext()
        .Get<ApplicationRoleManager>();

var roleName = rolesDDL.SelectedItem.Text;
var users = roleManager.FindByName(roleName).Users

【讨论】:

  • 看来我的 RoleManager 设置不正确还是什么?我知道角色在数据库中,因为它们加载到角色 DDL 中,但是当我尝试使用角色管理器时,它的计数为 0。这不应该是开箱即用的设置吗?
  • 您尝试使用 RoleManager 了吗?
  • @JordanWayneCrabb 抱歉,我不在 PC 上尝试代码。等我回来再看看,除非你先得到答案。
  • @AdamHeeg 查看我的编辑。 hutchonoid:谢谢,我会继续玩它,但我觉得我现在是在黑暗中拍摄。
  • 我使用过角色管理器和 aspnet 角色,但与 Raven 和 OWIN 不同。抱歉,我帮不上忙。
猜你喜欢
  • 2012-02-27
  • 1970-01-01
  • 2021-03-03
  • 2019-09-10
  • 2021-10-10
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
相关资源
最近更新 更多