我无法使用自定义授权属性

时间:2016-12-11 03:39:51

标签: c# asp.net-mvc authorization action-filter authorize-attribute

我尝试装饰一个完整的控制器类,如下所示:

namespace SisParkTD.Controllers
{
    [CustomAuthorize]
    public class AbonosController : Controller
    {

我可以装饰控制器中的方法但不能装饰完整的控制器。

我尝试装饰控制器类时得到的错误是:

  

“CustomAuthorize”属性无效   这种声明类型。它仅对“方法”声明有效。

     

属性'SisparkTD.Filters.CustomAuthorizeAttribute'在此声明类型上无效。仅在“方法”声明中有效。

以下是CustomAuthorizeAttribute的代码:

namespace SisParkTD.Filters
{
    [AttributeUsage(AttributeTargets.Method)]
    public class CustomAuthorizeAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            using (var db = new SpContext())
            {
                var controller = (string)httpContext.Request.RequestContext.RouteData.Values["controller"];
                var action = (string)httpContext.Request.RequestContext.RouteData.Values["action"];
                var accion = db.Acciones.FirstOrDefault(a => a.Descripcion == action && a.Pagina.Descripcion == controller);
                var username = httpContext.User.Identity.Name;
                var usuario = db.Usuarios.FirstOrDefault(u => u.NombreDeUsuario == username);

                if (usuario == null) return false;
                if (accion == null) return false;
                var rolesId = db.RolesUsuarios.Where(ru => ru.UsuarioId == usuario.UsuarioId).Select(ru => ru.RolId);
                if (!rolesId.Any()) return false;

                foreach (var rolId in rolesId)
                {
                    if (db.Permisos.Find(rolId, accion.AccionId) != null) return base.AuthorizeCore(httpContext);
                }
                return false;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

从属性中删除[AttributeUsage(AttributeTargets.Method)]。 (感谢SLaks的回答)