Передача ASP.NET MVC AuthorizeAttribute оценивает ActionMethod?

Я - только вновь прибывший на ASP.NET MVC и не уверен, как достигнуть определенной задачи "правильный путь".

По существу я храню зарегистрированный идентификатор пользователя в HttpContext. Пользователь. Идентификационные данные и записали EnhancedAuthorizeAttribute выполнить некоторую пользовательскую авторизацию.

В переопределенном OnAuthorization метод, моя модель предметной области поражает базу данных, чтобы гарантировать, что текущий идентификатор пользователя может получить доступ к переданному в routeValue "BatchCode". Прототип:

ReviewGroup GetReviewGroupFromBatchCode(string batchCode);

Это возвратит пустой указатель, если пользователь не может получить доступ к ReviewGroup, и OnAuthorization затем запрещает доступа.

Теперь, я знаю, что украшенный метод действия будет только выполняться, если OnAuthorization передаст, но я не хочу поражать базу данных во второй раз для получения ReviewGroup снова.

Я думаю о хранении ReviewGroup в HttpContext.Items["reviewGroup"] и доступ к этому от контроллера в данный момент.

Действительно ли это - выполнимое решение или является мной на неправильном пути?

Спасибо!

6
задан DaveRandom 25 February 2013 в 22:49
поделиться

3 ответа

Если вы не сделаете ОЧЕНЬ большой выбор из ReviewGroup или у вас огромная база данных, то второе попадание в базу данных не будет слишком большой проблемой. Современные базы данных очень эффективны при выборе, особенно с правильно проиндексированными таблицами.

По моему опыту,это лучший способ авторизации и метод, аналогичный тому, как я санкционировал конкретные действия в своих приложениях.

Короче говоря, я бы совсем не беспокоился о втором попадании в базу данных.

0
ответ дан 17 December 2019 в 20:29
поделиться

HttpContext.Items активен только на время запроса. Если вы хотите сохранить его в течение более длительного времени, вы должны поместить его в

а) сеанс - хорошо

б) профиль - не вижу преимущества

в) cookie - не рекомендуется

г) нажмите база данных каждый раз - должно быть в порядке

Сохранить его в filterContext.RouteData.DataTokens?

1
ответ дан 17 December 2019 в 20:29
поделиться

В качестве альтернативы, один из лучших и самых простых способов избежать попадания в базу данных - это кэширование. Получите его, вставьте в тайник. Если он снова понадобится, он уже находится в памяти, и обращение к БД не требуется. В противном случае, когда кеш выходит за пределы области видимости, объект тоже.

1
ответ дан 17 December 2019 в 20:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: