valores por obtener net eventos div dinamicos dinamicamente crear controles codigo botones asp c# asp.net asp.net-mvc asp.net-identity authorize-attribute

c# - por - Añadir roles dinámicamente para autorizar atributo para el controlador



crear eventos dinamicamente c# (2)

Necesito habilitar a mi usuario administrador para que cambie los permisos de acceso para los usuarios sobre la marcha, de modo 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.

Así que 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 base de datos?


¿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.


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:

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