4

我需要按角色过滤用户,但所有用户都属于两个角色

示例:对于一个用户,对于Admin另一个用户。Group1UserGroup1

现在我想按Group1Role 过滤它们并忽略Adminand User

public ViewResult Index()
{
    string[] roles = Roles.GetRolesForUser();
    var group = string.Join(" ", roles ); 
    group = group.Replace("Admin", "");//Used this to single out Group1 from Admin user
    return View(new UserViewModel
                    {
                        Users = _userService.FindAll().Where(x => Roles.GetRolesForUser(x.UserName).Contains(group)),
                        Roles = roles
                    });
}

这不会出错,但它显示为空。我想我知道为什么,但仍然无法弄清楚如何绕过它......

4

3 回答 3

2
public ViewResult Index()
{
   var roleFilter = Roles.GetRolesForUser().First(r => !r.equals("Admin"));

   return View(new UserViewModel
                {
                    Users = _userService.FindAll().Where(x => Roles.GetRolesForUser(x.UserName).Contains(roleFilter)),
                    Roles = new [] {roleFilter}
                });
}
于 2012-10-03T18:30:00.863 回答
2

好吧,就这样吧。我对您的问题的理解是您想检查用户是否具有一个或多个特定角色。如果是,允许访问;否则,拒绝他们访问并将他们送入黑洞。听起来在您的示例中您只想检查一个特定角色。阅读您的一些评论后,您可能还想在某个时候检查多个角色。我将向您展示的代码示例允许您根据一组一个或多个角色来检查用户,用户必须分配给这些角色才能访问页面。

string[] requiredRoles = new string[] { "Awesome", "Pancake" };
if (requiredRoles.Except(theUsersAssignedRoles).Any())
{
    // Authorization has failed!
    // The user is not awesome and they are not a pancake.
}
else
{
    // User is awesome and a pancake so let them through.
}

这里的想法是列出所有必需的角色,并减去用户分配给他或她的所有角色。如果减法后列表中还有任何角色,则用户没有所有必需的角色。这里有一些例子。授权所需的角色在减号的左侧,而用户分配的角色在减号的右侧,就像上面的代码一样。

用户很棒,而且是煎饼,因此允许他们访问。请注意,我们最终得到一个空集,这意味着用户满足要求:

{ "Awesome", "Pancake" } - { "Awesome", "Pancake" } = { }

用户只是一个煎饼。他们不被允许访问。结果集包含“Awesome”,这意味着它们缺少“Awesome”角色:

{ "Awesome", "Pancake" } - { "Pancake" } = { "Awesome" }

这个用户不是很棒也不是煎饼,但她是管理员。尽管如此,我们仍然需要很棒的煎饼才能进入该页面,因此该用户被拒绝访问:

{ "Awesome", "Pancake" } - { "Admin" } = { "Awesome", "Pancake" }

如果您有任何问题或这不是您想要的,请发表评论。如果需要,我很乐意为您提供进一步的帮助。

于 2012-10-04T01:42:49.033 回答
0

听起来您确实在尝试使用此方法:

http://msdn.microsoft.com/en-us/library/system.web.security.roleprovider.getusersinrole.aspx

参数

roleName 类型:System.String 获取用户列表的角色名称。

于 2012-10-03T18:24:55.330 回答