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

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

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

目前我有 2 个角色可以看到此内容:global 和 admin。

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

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

// 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] 的成员,他们将看不到他们需要的内容。

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

最佳答案

If the user is in rolesArr[0] but not in rolesArr[1] then the loop will mark them "not allowed" and they won't see the content they need to as a member of 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() 而不是 任何()。没有 LINQ 会怎样?简单地:

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

    return false;
}

关于c# - 根据用户角色动态显示内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45160153/

相关文章:

c# - 如何让 C# 文本框自动完成以根据包含而不是开头提出建议?

c# - SendKey.Send() 不工作

c# - 有适用于 Mac OS X 的 C# 编译器吗?

javascript - MS Edge 处理 401 错误,从而绕过我的错误处理程序

c# - Page.User.Identity 与 Request.LogonUserIdentity 之间的区别

c# - 在运行时动态调用 Web 服务

c# - Entity Framework 代码优先 - 具有连接/链接表的一对多

javascript - 禁用 JavaScript 时的 ASP.NET LinkBut​​ton

javascript - 如果单击按钮,如何停止执行文本框事件更改方法

asp.net - 您将如何使用 asp.net mvc 创建用户数据库