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



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

目前,我有 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]成员所需的内容。

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

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

最新更新