Agregue roles dinámicamente al atributo de autorización para el controlador

Necesito habilitar a mi usuario administrador para que cambie los permisos de acceso para los usuarios sobre la marcha, para que puedan crear nuevos roles y agregar permisos a esos roles.

Quiero poder crear un atributo de Authorize para mantenerse por encima de mi clase de controlador a la que puedo agregar roles desde una base de datos, para que no tenga que ‘establecer’ los roles durante el desarrollo, como en [Authorize(Roles="Role1, Role2")] etc.

Entonces, algo como [Authorize(Roles = GetListOfRoles()]

Encontré esta pregunta: ¿ ASP.NET MVC Autoriza al usuario con muchos roles que hacen algo similar pero tal vez hay una manera de cambiar esto de modo que obtenga una lista de permisos / roles de la db?

Así es como conseguí un atributo que podría autorizar a los usuarios por método en función de los permisos de la función de ese usuario. Espero que esto ayude a alguien más:

 ///  /// Custom authorization attribute for setting per-method accessibility ///  [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class SetPermissionsAttribute : AuthorizeAttribute { ///  /// The name of each action that must be permissible for this method, separated by a comma. ///  public string Permissions { get; set; } protected override bool AuthorizeCore(HttpContextBase httpContext) { SalesDBContext db = new SalesDBContext(); UserManager userManager = new UserManager(new UserStore(new ApplicationDbContext())); ApplicationDbContext dbu = new ApplicationDbContext(); bool isUserAuthorized = base.AuthorizeCore(httpContext); string[] permissions = Permissions.Split(',').ToArray(); IEnumerable perms = permissions.Intersect(db.Permissions.Select(p => p.ActionName)); List roles = new List(); 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; } } 

¿Qué tal algo como esto?

 [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); } } 

Podría usarlo con una base de datos, o simplemente mantener una lista de roles autorizados en web.config.