Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于用户角色动态显示内容_C#_Asp.net_Asp.net Membership_Asp.net Roles - Fatal编程技术网

C# 基于用户角色动态显示内容

C# 基于用户角色动态显示内容,c#,asp.net,asp.net-membership,asp.net-roles,C#,Asp.net,Asp.net Membership,Asp.net Roles,如果用户不是应该看到我的页面的角色,我的页面将隐藏内容 目前我有两个角色可以查看此内容:全局和管理员 如果用户处于这两个角色中的任何一个,他们都应该能够看到内容,但我很难确定条件 以下是到目前为止我得到的信息: // roles can be a single role ("global") // or it can be multiple roles ("global,admin") private bool CheckAllowed(string roles) { var user

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

目前我有两个角色可以查看此内容:全局和管理员

如果用户处于这两个角色中的任何一个,他们都应该能够看到内容,但我很难确定条件

以下是到目前为止我得到的信息:

// 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]
成员所需的内容

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

如果用户在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;
}

我从来没有想过要用linq来做这个。。。它很漂亮。当我测试它时,马克会回答吗?但现在你得到+1