2017-07-18 4 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]のメンバーとして必要なコンテンツを表示しません]。

ユーザーが何であるかを確認するには、これらの役割のうちいずれかがである必要があります。あなたのコードで

bool allowed = rolesArr.Any(x => user.IsInRole(x)); 

で:このためのLINQの方法があります

foreach (string r in rolesArr) 
    allowed = (user.IsInRole(r)) ? true : false; 

各反復でも(前の結果が上書きされるので、ユーザはリストの最後の役割である場合は、ちょうどチェックし、この式はallowed = user.IsInRole(r)に簡略化することができます)。


あなたのコードを単純化するかもしれないことに注意してください。まず文字列がリストであるかどうかを確認する必要はありません。常にSplit()という文字列があります。パフォーマンスへの影響は無視できるので、それはあなたの努力に値するものではありません。要するに、あなたのコードは次のようになります。あなたは、ユーザーがあなたの代わりにAny()All()を使用することができ、すべての役割であるかどうかを確認する必要がある場合は、他の

private bool CheckAllowed(string roles) 
    => roles.Split(',').Any(x => HttpContext.Current.User.IsInRole(x)); 

だけのため参照場合誰かが、それを必要とします。それは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

関連する問題