16

Ich muss meinen Admin-Benutzer aktivieren, um Zugriffsberechtigungen für Benutzer im laufenden Betrieb zu ändern, sodass sie neue Rollen erstellen und diesen Rollen Berechtigungen hinzufügen können.Rollen dynamisch hinzufügen, um das Attribut für Controller zu autorisieren

ich in der Lage sein wollen, ein Authorize Attribut erstellen über meinem Controller-Klasse zu halten, die ich Rollen aus einer Datenbank hinzufügen können, so dass ich nicht auf ‚‘ die Rollen während der Entwicklung, wie in [Authorize(Roles="Role1, Role2")] etc .

so etwas wie [Authorize(Roles = GetListOfRoles()]

ich diese Frage gefunden - ASP.NET MVC Authorize user with many roles, die eine Möglichkeit, diese so zu ändern, es etwas ähnliches, aber vielleicht tut ist, dass es eine Liste der Berechtigungen/Rollen aus der db bekommt?

+0

sollten Sie benutzerdefinierte Rolle Anbieter erstellen, nehme ich an. Aber du hättest eine Liste mit Contollern und allen Methoden in db. –

Antwort

16

So habe ich ein Attribut abgerufen, das Benutzer je Methode basierend auf den Berechtigungen der Rolle dieses Benutzers autorisieren kann. Ich hoffe, das hilft jemand anderem:

/// <summary> 
/// Custom authorization attribute for setting per-method accessibility 
/// </summary> 
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class SetPermissionsAttribute : AuthorizeAttribute 
{ 
    /// <summary> 
    /// The name of each action that must be permissible for this method, separated by a comma. 
    /// </summary> 
    public string Permissions { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     SalesDBContext db = new SalesDBContext(); 
     UserManager<ApplicationUser> userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
     ApplicationDbContext dbu = new ApplicationDbContext(); 

     bool isUserAuthorized = base.AuthorizeCore(httpContext); 

     string[] permissions = Permissions.Split(',').ToArray(); 

     IEnumerable<string> perms = permissions.Intersect(db.Permissions.Select(p => p.ActionName)); 
     List<IdentityRole> roles = new List<IdentityRole>(); 

     if (perms.Count() > 0) 
     { 
      foreach (var item in perms) 
      { 
       var currentUserId = httpContext.User.Identity.GetUserId(); 
       var relatedPermisssionRole = dbu.Roles.Find(db.Permissions.Single(p => p.ActionName == item).RoleId).Name; 
       if (userManager.IsInRole(currentUserId, relatedPermisssionRole)) 
       { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 
} 
+1

wie 'SetPermissionsAttribute' mit Aktionsmethode zu verwenden? Was muss ich mit 'SetPermissionsAttribute' weitergeben? – Mou

+0

Es ist eine Weile her, aber wenn ich mich richtig erinnere, ist es etwas wie '[SetPermissions =" ​​Action1, Action2 "]' aber ich bin mir nicht sicher. –

+0

Jeder sollte beachten, dass dies eine Weile her war und die tatsächlichen LINQ-Abfragen verbessert werden konnten, und der Datenbankkontext und der Benutzermanager sollten injiziert werden, oder das Repository sollte injiziert werden (wenn das Repository-Muster verwendet wird). –

7

Was ist so etwas wie dieses:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class MyCustomAuthorizationAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     // Do some logic here to pull authorised roles from backing store (AppSettings, MSSQL, MySQL, MongoDB etc) 
     ... 
     // Check that the user belongs to one or more of these roles 
     bool isUserAuthorized = ....; 

     if(isUserAuthorized) 
      return true; 

     return base.AuthorizeCore(httpContext); 
    } 
} 

Sie es mit einer Datenbank verwenden können, oder einfach eine Liste der zugelassenen Rollen in der web.config halten.

+5

Ich denke, ich weiß, wohin du damit gehst, aber um der anderen willen, die von diesem q/a Kenntnis erlangen können, kannst du deine Antwort bearbeiten, um sie holistischer zu machen (wie etwa die Logik der Autorisierung eines Benutzers) Fügen Sie auch eine Liste von IdentityRoles aus der db als Beispiel ein), und dann werde ich sie als akzeptiert markieren. –