2010-07-07 3 views
6

У меня есть аутентификация форм, и мне нужен пользовательский объект, который будет храниться в HttpContext.Current.User и в Thread.CurrentPrincipal.PostAuthenticateRequest пожаров несколько раз

Чтобы получить это, я слушаю событие PostAuthenticateRequest, а затем прочитаю из базы данных все данные пользователя, которые необходимо сохранить в HttpContext.Current.User и в Thread.CurrentPrincipal, затем я создаю пользовательские объекты IPrincipal и IIdentity и назначаю их в вышеуказанные места.

Проблема заключается в том, что по какой-то причине PostAuthenticateRequest срабатывает несколько раз для одного запроса .. Это приводит к ненужным DB туда и обратно, что производительность больно ..

Как мне решить эту проблему? (ASP.NET MVC 2)

Спасибо.

ответ

5

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

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

+0

О, да! Дело с ресурсами и т. Д. Ускользнуло от меня! Спасибо за переподготовку! Я уже рассматривал кеширование. Но это также имеет последствия. Например, я прочитал из БД и сохранил разрешения Главного пользователя. Наличие в кеше не очень хорошая идея, если администратор решит изменить разрешение для пользователя - разрешения кэшированных пользователей не будут обновляться до тех пор, пока пользователь не выйдет из системы/не войдет в систему. Вам нужно попробовать свою идею с «кратким» кэшированием. Похоже, он должен соответствовать законопроекту. Большое спасибо! – Ant

+0

Вы можете обновить кеш для текущего пользователя на странице_Инте. Затем он будет перезагружен из БД только один раз на страницу запроса. Это всегда будет происходить до того, как будут запрошены любые другие запросы, поскольку страница еще не была отображена. –

1

Просто используйте тег в своем web.config, чтобы удалить любую аутентификацию из ваших скриптов, css и каталогов изображений. Например:

<system.web> 
... 
</system.web> 

<location path="~/Scripts"> 
    <system.web> 
     <authorization> 
     <allow users="*"/> 
     </authorization> 
    </system.web> 
</location> 
+2

Это не поможет, потому что это событие срабатывает при каждом запросе независимо от того, попадаете ли вы на страницу, которая отредактирована или нет. – jlp

Смежные вопросы