如何检查是否只有一个角色匹配?

时间:2012-10-03 17:27:09

标签: c# asp.net-mvc membership

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

示例:一位用户AdminGroup1,另一位用户UserGroup1

现在我想按Group1角色过滤它们,然后忽略AdminUser

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

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

3 个答案:

答案 0 :(得分: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}
                });
}

答案 1 :(得分: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", "Pancake" } - { "Pancake" } = { "Awesome" }

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

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

如果您有任何问题或者这不是您想要的,请发表评论。如果需要的话,我很乐意帮助你。

答案 2 :(得分:0)

听起来你真的想尝试使用这种方法:

  

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

     

参数

     

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