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