2016-05-10 11 views
1

Ich versuche, die folgendeASP.NET Identität Rollen

Es gibt mehrere Rollen (role1, role2, role3 usw.) zu erreichen, und sie alle unterschiedliche Zugriffsebenen haben. Role2 kann auf dasselbe zugreifen, wie Rolle1, aber nicht Rolle3.

Ich weiß, ich kann es mit dem Autorisieren-Attribut in der Steuerung tun, aber gibt es eine andere Möglichkeit, die eleganter statt nur eine Liste von Rollen im Attribut?

+1

Warum kombinieren Sie Rollen nicht zu einer Sammelrolle und verwenden diese Rolle auf dem Controller? Sie können auch Ihr eigenes AuthorizationAttribute schreiben und Ihre eigene benutzerdefinierte Logik in dieser Klasse definieren. – Igor

+0

@Igor Das benutzerdefinierte Attribut ist eine großartige Idee! Danke :) –

+0

Ein anderer Vorschlag. Wenn Rolle (N) auf Rolle (N-1) zugreifen kann, geben Sie Benutzern mehrere Rollen. Zum Beispiel kann der Benutzer in der Rolle3 auch in Rolle2 und Rolle1 sein. Auf diese Weise fügen Sie keine Liste von Rollen im Autorisierungsattribut hinzu, sondern Sie haben eine Rolle, die der Zugriffsebene entspricht. – tmg

Antwort

2

Sie können Autorisierungsrichtlinien konfigurieren, dh Rollen in Richtlinien gruppieren.

ASP.NET Core-Beispiel:

services.AddAuthorization(options => 
      { 
       options.AddPolicy("Role1", policy => policy.RequireRole("Role1"); 
       options.AddPolicy("Role2", policy => policy.RequireRole("Role1", "Role2"); 
       options.AddPolicy("Role3", policy => policy.RequireRole("Role1", "Role2", "Role3"); 
      }); 

und nutzen Sie Ihre Richtlinien in Ihrem Controller mit einem autorisieren Attribute:

[Authorize(Policy = "Role3")] 
1

ich es auf folgende Weise gelöst:

AuthorizeRoleAttribute .cs

public class AuthorizeRoleAttribute : AuthorizeAttribute 
{ 
    public AuthorizeRoleAttribute(string role) : base() 
    { 
     var result = Enum.Parse(typeof(RolesEnum), role); 
     int code = result.GetHashCode(); 
     List<string> list = new List<string>(); 
     foreach (var item in Enum.GetValues(typeof(RolesEnum))) 
     { 
      int tmpCode = item.GetHashCode(); 
      if (tmpCode >= code) 
      { 
       list.Add(item.ToString()); 
      } 
     } 
     Roles = string.Join(",", list); 
    } 

} 
ENUM

Rolle:

public enum RolesEnum 
{ 
    User = 100, 
    Supervisor = 200, 
    Administration = 300, 
    Admin = 400 
} 

Controller:

[AuthorizationRole ("Betreuer)] // einige Code

Der Controller automatisch nachschlagen, welche Rollen mehr haben oder den gleichen Zugang zu Vorgesetzten durch die Nummer in der Enum.

+1

Wenn Sie zusätzliche Sicherheit wollten, dann wandeln Sie diese Zeichenkette in einen enum-Parameter im Konstruktor um. 'AuthorizeRoleAttribute (RolesEnum-Rolle): base()'. Dann wenden Sie es an "[AuthorizationRole (RolesEnum.Supervisor)]' '. Jetzt müssen Sie sich keine Gedanken mehr um Rechtschreibfehler machen. – Igor

Verwandte Themen