即使没有在控制器/操作中设置global.asax和Attributes,我的自定义授权属性也会始终触发

时间:2011-09-21 13:21:30

标签: .net asp.net-mvc asp.net-mvc-3

我有一个始终触发的自定义授权属性。我删除了global.asax中的配置,并且在控制器/操作中没有属性。为什么呢?

public class ValidatePermissionAttribute : AuthorizeAttribute
{
    private AuthorizationContext _context;

    public override void OnAuthorization(AuthorizationContext context)
    {
        _context = context;

        base.OnAuthorization(context);
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool isAuthorized = false;

        //Use _context here
        ...

        return isAuthorized;
    }
}

我的Global.asax:

public class MvcApplication : NinjectHttpApplication
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new LogActionAttribute());

        //ValidatePermissionFilterProvider validatePermissionProvider = new ValidatePermissionFilterProvider();

        //validatePermissionProvider.Add("Login", "Index");
        //validatePermissionProvider.Add("Erro", "*");

        //FilterProviders.Providers.Add(validatePermissionProvider);
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Usuario", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

    protected override void OnApplicationStarted()
    {
        DefaultModelBinder.ResourceClassKey = "ViewModelValidations";

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        Database.SetInitializer(new DatabaseInitializer());
    }

    protected override IKernel CreateKernel()
    {
        return DependencyResolverFactory.Instance.Kernel;
    }
}

发现问题:

回答@DarinDimitrov我发现了问题,我正在使用Ninject在我的Filter中注入一个依赖,这导致每个Controller中都会触发:

public class ApplicationServicesModule : NinjectModule
{
    public override void Load()
    {
        this.BindFilter<ValidatePermissionAttribute>(FilterScope.First, null);
    }
}

2 个答案:

答案 0 :(得分:0)

只有自定义属性不会执行任何操作。必须有一些注册它的代码。它可以注册为全局动作过滤器,您可以使用它来装饰控制器/动作,也可以使用依赖注入框架将其注册为全局动作过滤器。右键单击ValidatePermissionAttribute并搜索此类正在使用的位置。通常VS会显示您注册的位置。

答案 1 :(得分:0)

如果您的控制器派生自自定义控制器基类,您可能需要检查它以查看该属性是否也存在。您还可以尝试在属性名称ValidatePermissionAttribute上执行解决方案范围内的查找用法,以查看是否存在您错过的位置。

编辑:查看你的global.asax,我看到你正在注册LogActionAttribute - 该属性是否可能来自你的其他自定义授权属性?我会尝试删除所有自定义注册和过滤器以查看问题是否仍然存在