Сеанс MVC3 в пользовательском фильтре авторизации Странное поведение - PullRequest
1 голос
/ 24 июня 2011

Мы недавно обновили mvc2 до mvc3, и один из наших пользовательских фильтров авторизации (которые используются в методах ActionResult), похоже, создается один раз, но выполняется несколько раз.Мы знаем это, поскольку Фильтр содержит список ошибок (который был обновлен в конструкторе), и ошибки добавляются в AuthorizeCore.

Пользовательский фильтр используется для проверки прав доступа пользователей к определенномуМетод действия (и их уровень хранится в сеансе)

Некоторый код:

public class SecurityAttribute : AuthorizeAttribute
    {
        public int MinAccessLevel = 1;
        public string UserRole = String.Empty;
        private List<string> _errors;

        public SecurityAttribute()
        {
            _errors = new List<string>();
        }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {

            if (WebSession.AccessLevel < MinAccessLevel)
                _errors.Add("Your access level(" + WebSession.AccessLevel + ") must be " + MinAccessLevel + " or higher");

            if (!String.IsNullOrEmpty(UserRole) && WebSession.UserRole != UserRole)
                _errors.Add("Your User Role must be " + UserRole);

            if (_errors.Any())
            {
                var viewResult = new ViewResult() { ViewName = "SecurityError"};
                viewResult.ViewData.Model = new SecurityErrorViewModel(){Errors = _errors};
                filterContext.Result = viewResult;
            }
        }
    }

Это можно использовать, как показано ниже:

[HttpPost, Security(MinAccessLevel = 4)]
public ActionResult Complete(int id, string userid){}

Выход напредставление (через произвольные интервалы) выглядит так (в маркированном списке)

  • Ваш уровень доступа (6) должен быть 4 или выше
  • Ваш уровень доступа (6) должен быть4 или выше
  • Ваш уровень доступа (6) должен быть 4 или выше
  • Ваш уровень доступа (6) должен быть 4 или выше

Эта проблема возникла толькоПосле того, как мы обновились до mvc3, я ищу какие-либо подсказки о том, почему это могло произойти, или соответствующее исправление.Я читал различные сообщения SO, касающиеся контроллеров Sessionless State и тому подобного, но, похоже, это не соответствует сценарию, с которым мы сталкиваемся

Спасибо, Марк

1 Ответ

2 голосов
/ 24 июня 2011

Согласно примечаниям к выпуску MVC 3:

В предыдущих версиях ASP.NET MVC фильтры действий создавались для каждого запроса, за исключением нескольких случаев.Такое поведение никогда не было гарантированным поведением, а являлось лишь деталью реализации, и контракт на фильтры заключался в том, чтобы считать их не имеющими состояния.В ASP.NET MVC 3 фильтры кэшируются более агрессивно.Поэтому любые фильтры пользовательских действий, которые неправильно хранят состояние экземпляра, могут быть повреждены.

Поэтому не следует хранить ошибки в фильтре действий.Либо обновите список непосредственно в методе OnAuthorization, либо, если вам нужен доступ к ним в другом месте, вы можете сохранить их в HttpContext.Items или Session.

...