2017-07-18 5 views
1

Meine Seite blendet Inhalt aus, wenn der Benutzer nicht in einer Rolle ist, die ihn sehen soll.Inhalt dynamisch basierend auf Benutzerrolle anzeigen

Momentan habe ich 2 Rollen, die diesen Inhalt sehen können: global und admin.

Wenn der Benutzer in einer dieser Rollen ist, sollten sie in der Lage sein, den Inhalt zu sehen, aber ich habe Probleme beim Ausarbeiten der Bedingung.

Hier ist, was ich bisher habe:

// 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; 
} 

Mein Problem mit der Schleife ist.

Wenn der Benutzer in rolesArr[0] ist aber nicht in rolesArr[1] dann wird die Schleife sie markieren „nicht erlaubt“ und sie werden die Inhalte, die sie brauchen, um als Mitglied der rolesArr[0] nicht sehen.

Wie kann ich verfolgen, ob ein Benutzer den rollenspezifischen Inhalt genauer anzeigen kann?

Antwort

3

Wenn der Benutzer in rolesArr [0] ist aber nicht in rolesArr [1] dann wird die Schleife sie markieren wird „nicht erlaubt“ und sie werden die Inhalte, die sie brauchen, um als Mitglied der rolesArr nicht sehen [0 ].

Dann, was Sie überprüfen, ob es Benutzer ist hat jede dieser Rollen. Es gibt eine LINQ Methode hierfür:

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

In Ihrem Code mit:

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

Sie wurden überprüft nur, wenn der Benutzer in der letzten Rolle der Liste ist, weil jede Iteration vorheriges Ergebnis überschrieben wird (auch Beachten Sie, dass dieser Ausdruck auf allowed = user.IsInRole(r) vereinfacht werden kann.


Das sagte, beachten Sie, dass Sie Ihren Code vereinfachen könnten. Zuerst müssen Sie nicht überprüfen, ob die Zeichenfolge eine Liste ist oder nicht, immer Split() die Zeichenfolge: Leistungseinfluss ist so vernachlässigbar, dass es sich nicht lohnt. Kurz gesagt kann der Code sein:

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

Just for Referenz falls jemand anderes es brauchen, wenn Sie Benutzer überprüfen müssen, ob in jeder Rolle ist es, Ihnen All() statt Any() verwenden können. Wie sieht es ohne LINQ aus? Einfach:

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

    return false; 
} 
+1

Ich ... hätte nie gedacht, mit linq für diese ... Es ist schön. Wird markiert, wenn ich es getestet habe, aber jetzt erhältst du +1 – Ortund

Verwandte Themen