El uso de cuerdas mágicas le da la flexibilidad para declarar múltiples funciones en el atributo Autorizar (por ejemplo, [autorice (Roles = "Administrador, Moderador")], que tiende a perder a medida que avanza a una solución inflexible. pero aquí es cómo se puede mantener esta flexibilidad al mismo tiempo conseguir todo lo inflexible de tipos
Definir sus papeles en una enumeración que utiliza indicadores de bits:.
[Flags]
public enum AppRole {
Admin = 1,
Moderator = 2,
Editor = 4,
Contributor = 8,
User = 16
}
Anulación AuthorizeAttribute:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyAuthorizeAttribute : AuthorizeAttribute {
public AppRole AppRole { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext) {
if (AppRole != 0)
Roles = AppRole.ToString();
base.OnAuthorization(filterContext);
}
}
Ahora si se puede usar MyAuthorizeAttribute así:
[MyAuthorize(AppRole = AppRole.Admin | AppRole.Moderator | AppRole.Editor)]
public ActionResult Index() {
return View();
}
La acción anterior sólo se autorizará a los usuarios que se encuentran en al menos una de las funciones enumeradas (Administrador, Moderador, o el editor). El comportamiento es el mismo que el atributo AuthorizeAttribute predeterminado de MVC, excepto sin las cadenas mágicas.
Si se utiliza esta técnica, aquí está un método de extensión en IPrincipal que también pueden ser útiles:
public static class PrincipalExtensions {
public static bool IsInRole(this IPrincipal user, AppRole appRole) {
var roles = appRole.ToString().Split(',').Select(x => x.Trim());
foreach (var role in roles) {
if (user.IsInRole(role))
return true;
}
return false;
}
}
Usted puede utilizar este método de extensión de esta manera:
public ActionResult Index() {
var allowed = User.IsInRole(AppRole.Admin | AppRole.Moderator | AppRole.Editor);
if (!allowed) {
// Do Something
}
return View();
}
Fui con esta solución debido a su simplicidad. Los cambios de código fueron mínimos, ya que solo tuve que reemplazar cadenas codificadas con referencias constantes. – MikeWyatt