Basado en ajbeaven's answer, logré extenderlo a la lista de funciones en lugar de una función.
En primer lugar el Restringir clase:
public class Restrict : AuthorizeAttribute {
private List<string> _roles;
public string Roles {
get {
string roles = "";
if (_roles != null && _roles.Count > 0) {
int counter = 0;
foreach (string role in _roles) {
counter++;
if (counter == _roles.Count) {
roles = role;
} else {
roles += role + ",";
}
}
}
return roles;
}
set {
_roles = new List<string>();
string[] roles = value.Split(',');
foreach (string role in roles) {
_roles.Add(role);
}
}
}
public Restrict() {
_roles = new List<string>();
}
protected override bool AuthorizeCore(HttpContextBase httpContext) {
bool result = true;
if (httpContext == null) {
throw new ArgumentNullException("httpContext");
}
foreach (string role in _roles) {
if (httpContext.User.IsInRole(role)) {
result = false;
break;
}
}
return result;
}
}
A continuación, añadir la clase AppRoles para que todo el reutilizable solución:
public static class AppRoles {
public const string Role1 = "Role1";
public const string Role2 = "Role2";
}
Uso:
[Authorize]
[Restrict(Roles = AppRoles.Role1 + "," + AppRoles.Role2)]
public ActionResult Index() {
return View();
}
No puedo imaginar un escenario donde la desconexión desde una implementación de lista blanca hasta una implementación de lista negra tendría sentido. –
No quiero que mis administradores accedan a los controladores relacionados con el cliente, pero obviamente necesito que los usuarios no autorizados y los clientes puedan hacerlo. – ajbeaven
Hay muchos casos en los que tiene sentido, y la mayoría de los sistemas de autorización incluyen soporte para denegación. Considere un escenario donde todos los usuarios tienen permiso para hacer algo, excepto para los miembros de un rol específico. – ShadowChaser