2017-07-18 110 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