根据用户角色动态显示内容

时间:2017-07-18 07:23:40

标签: c# asp.net asp.net-membership asp.net-roles

如果用户不在应该看到的角色,我的页面会隐藏内容。

目前,我有2个角色可以看到此内容:全局和管理员。

如果用户处于这些角色中的任何一个,他们应该能够看到内容,但我无法解决问题。

这是我到目前为止所得到的:

// roles can be a single role ("global")
// or it can be multiple roles ("global,admin")
private bool CheckAllowed(string roles)
{
    var user = HttpContext.Current.User;
    var allowed = false;

    if (roles.Contains(","))
    {
        string[] rolesArr = roles.Split(',');

        foreach (string r in rolesArr)
        {
            allowed = (user.IsInRole(r)) ? true : false;
        }
    }
    else
    {
        allowed = (user.IsInRole(r)) ? true : false;
    }

    return allowed;
}

我的问题在于循环。

如果用户位于rolesArr[0]但不在rolesArr[1],那么循环将标记“不允许”,他们将无法看到他们需要的内容rolesArr[0]的成员。

如何跟踪用户是否可以更准确地查看特定于角色的内容?

1 个答案:

答案 0 :(得分:3)

  

如果用户在rolesArr [0]但不在rolesArr [1]中,那么循环将标记它们"不允许"他们作为rolesArr [0]的成员,他们不会看到他们需要的内容。

然后您要检查用户是否有任何这些角色。有一个LINQ方法:

bool allowed = rolesArr.Any(x => user.IsInRole(x));

在您的代码中:

foreach (string r in rolesArr)
    allowed = (user.IsInRole(r)) ? true : false;

您只是在检查用户是否在列表的最后一个角色中,因为每次迭代都会覆盖以前的结果(同时请注意,此表达式可能会简化为allowed = user.IsInRole(r))。

那就是说,请注意您可以简化代码。首先,您不需要检查字符串是否是列表,始终Split()字符串:性能影响是如此微不足道,以至于它不值得您努力。简而言之,您的代码可能是:

private bool CheckAllowed(string roles)
    => roles.Split(',').Any(x => HttpContext.Current.User.IsInRole(x));

只有引用以防其他人需要它,如果您需要检查用户是否在每个角色中,您可以使用All()代替Any()。没有LINQ它看起来怎么样?简单地:

private bool CheckAllowed(string roles)
{
    foreach (var role in roles.Split(','))
    {
        if (HttpContext.Current.User.IsInRole(x))
            return true;
    }

    return false;
}