如何在全局级别添加AuthorizeAttribute并将其排除在某些操作之外?

时间:2012-08-21 08:53:32

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

我需要检查某个操作是否具有特定属性,我需要在以下方法中执行此操作:

protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) {

}

我知道我可以在这里查看:

public override void OnAuthorization(AuthorizationContext filterContext) {

    filterContext.ActionDescriptor.IsDefined(typeof(AnonymousAllowedAttribute), true)
 ...
}

是否有人知道如何使用ActionDescriptor对象获取System.Web.HttpContextBase

更新

实际上我想要的是,标有AnonymousAllowedAttribute AuthorizeCore方法的任何操作都返回true或者如果可能的话不运行(我的意思是我的覆盖方法)。

1 个答案:

答案 0 :(得分:3)

要执行您想要的操作,您需要在global.asax中编写并注册新的FilterProvider。 例如:

public class AuthorizeFilterProvider:IFilterProvider
{
    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
    {
        if (!actionDescriptor.IsDefined(typeof(AnonymousAllowedAttribute), true))
            return new Filter[] {new Filter(new AuthorizeAttribute(), FilterScope.Action, 0), };
        return new Filter[0];
    }
}

global.asax中:

protected void Application_Start()
    {
        ....
        RegsterFilterProviders(FilterProviders.Providers);
    }

    private void RegsterFilterProviders(FilterProviderCollection providers)
    {
        providers.Add(new AuthorizeFilterProvider());
    }

现在,如果您的任何操作未标记为[AnonymousAllowed],则应用程序会将其标记为[Authorize] PS:不要忘记标记[AnonymousAllowed]您的登录并注册操作:)