Как добавить AuthorizeAttribute на глобальном уровне и исключить его для некоторых действий?

Мне нужно проверить, есть ли у действия определенный атрибут, и мне нужно сделать это следующим методом:

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 или, если возможно, не запускалось (я имею в виду мой метод переопределения).


person Saeid    schedule 21.08.2012    source источник
comment
Где вызывается AuthorizeCore?   -  person Kirill Bestemyanov    schedule 21.08.2012
comment
@KirillBestemyanov Все методы есть в public class GlobalAuthorizeAttribute : AuthorizeAttribute { которые вам должны помочь   -  person Saeid    schedule 21.08.2012
comment
Короткий ответ: вы не можете получить ActionDescriptor из HttpContextBase. Но если вы дадите более подробную информацию о том, что вы хотите, возможно, я помогу.   -  person Kirill Bestemyanov    schedule 21.08.2012
comment
@KirillBestemyanov Обновляю вопрос   -  person Saeid    schedule 21.08.2012
comment
Вы хотите пометить все методы своим GlobalAuthorizeAttribute, а затем исключить некоторые методы с атрибутом AnonymousAllowedAttribute?   -  person Kirill Bestemyanov    schedule 21.08.2012
comment
Если это правда, вы сделали это неправильно.   -  person Kirill Bestemyanov    schedule 21.08.2012
comment
@KirillBestemyanov Нет, я определил GlobalAuthorizeAttribute в Global.asax, затем некоторые действия отмечены AnonymousAllowedAttribute   -  person Saeid    schedule 21.08.2012
comment
Это не будет работать. Я напишу, как это сделать позже.   -  person Kirill Bestemyanov    schedule 21.08.2012


Ответы (1)


Чтобы делать то, что вы хотите, вам нужно написать и зарегистрировать новый FilterProvider в вашем файле global.asax. Пример:

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];
    }
}

глобальный.asax:

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

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

Теперь, если какое-либо ваше действие не помечено [AnonymousAllowed] приложением, думайте, что оно помечено как [Authorize]
PS: Не забудьте отметить [AnonymousAllowed] ваш вход в систему и регистрацию действий :)

person Kirill Bestemyanov    schedule 21.08.2012