2017-07-18 116 views
1

如果用户不在应该看到它的角色中,我的页面会隐藏内容。根据用户角色动态显示内容

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

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

回答

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; 
} 
+1

我......从未想过使用LINQ这...它的美丽。当我测试它时,马克会回答,但现在你得到+1 – Ortund