Выполнять код в пользовательском атрибуте перед MVC AuthorizeAttribute.

Проблема
Создайте пользовательский IAuthorizeAttribute, который будет выполняться перед атрибутом AuthorizeAttribute MVC по умолчанию. AuthorizeAttribute по умолчанию всегда запускается перед моим пользовательским атрибутом.

Вещи, которые я пробовал

  • Я сделал собственный атрибут, который наследуется от IAuthorizationFilter.
  • Я зарегистрировал этот атрибут как глобальный фильтр следующим образом:
    filters.Add(new HandleCrossDomainAuthenticationAttribute() { Order = 1 });
  • Я уже читал о фильтрах действий в msdn: http://msdn.microsoft.com/en-us/library/dd381609.aspx

Пользовательский атрибут

public class HandleCrossDomainAuthenticationAttribute : FilterAttribute, IAuthorizationFilter
{
    #region IAuthorizationFilter Members

    void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            tryCrossDomainAuthentication(filterContext); //this will set the filterContext.Result to a certain url
        }
    }

    #endregion
}

Другие наблюдения
Когда я указываю Order = 2 на AuthorizeAttribute, что вызывает у меня затруднения, это действительно работает. Но это не очень управляемый путь...


person Peter    schedule 11.05.2012    source источник


Ответы (1)


Должно быть, я прочитал статью msdn так, как хотел...

Свойство Order принимает целочисленное значение, которое должно быть равно 0 (по умолчанию) или больше, за одним исключением. Отсутствие свойства Order дает фильтру значение порядка -1, что указывает на неуказанный порядок. Любой фильтр действий в области действия, для свойства Order которой установлено значение -1, будет выполняться в неопределенном порядке, но перед фильтрами с указанным порядком.

Итак, читая это, кажется, что невозможно сделать то, что я хочу, если вы не напишете пользовательский AuthorizeAttribute или ControllerActionInvoker. Это действительно отстой!

person Peter    schedule 11.05.2012
comment
Почему вы просто не указываете Order как для Authorize, так и для вашего атрибута CustomAuthorize? - person Andrej Kaurin; 13.05.2012
comment
Потому что это заставляет меня указывать порядок для каждого атрибута авторизации, а у меня их довольно много. Было бы намного легче управлять, если бы я мог сохранить эту настройку централизованно. - person Peter; 14.05.2012
comment
@Peter определите свой собственный атрибут, унаследованный от AuthorizeAttribute, и установите для Order значение X в конструкторе, что сохранит централизованные настройки - person Igor Yalovoy; 30.04.2016