2016-07-29 2 views
0

если этот вопрос как-то не по теме, дайте мне знать. Я возьму его в другом месте, но я хотел бы получить некоторые идеи о том, как выполнить что-то в рамках существующего проекта.Можно ли кэшировать авторизацию в ASP.NET MVC & Identity 2.0?

Мое веб-приложение (с использованием ASP.NET MVC 5 и ASP.NET Identity 2.0) выполняет авторизацию (через эти причудливые атрибуты Authorize) с помощью настраиваемого поставщика роли. Каждая проверка полномочий (например, Authorize(Roles = "Admin")) требует запросов к базе данных для выполнения следующих действий:

  • Получить текущий «семестр» (проверить, что диапазон дат текущая дата & время попадает в) из Semesters таблицы
  • Get позиция с именем «Admin» из таблицы Positions
  • Проверьте, существует ли запись в таблице Leaders, содержащей текущий идентификатор пользователя, полученный идентификатор семестра и полученный идентификатор позиции.

Если запись существует, пользователь авторизован, в противном случае это не так. Чтобы быть понятным, назначение роли привязано к семестру, чтобы ограничить соответствующие привилегии продолжительностью семестра. I.e., как только семестр заканчивается, пользователь больше не имеет своих полномочий, но следующий человек, назначенный на следующий семестр, немедленно получит их.

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

Вот изображение базы данных просто чтобы понять: enter image description here

Есть ли способ в кэш (так что я не должен постоянно запрашивать базу данных) эти разрешения на длительное время эквивалентно времени с момента, когда проверка сначала выполняется/кэшируется до конца семестра? Или просто кешируйте их вообще за любое количество времени, которое разумно? В идеале, если по какой-либо причине обновляется семестр или позиция, авторизации каким-то образом становятся недействительными и повторно кэшируются. И, наконец, настраиваемый RoleProvider - прочный способ сделать это?

ответ

1

Я был бы осторожен в кэшировании авторизации. Вы хотите оставаться гибким с этим, и без тщательного проектирования вы можете легко пробить дыры в безопасности в своем приложении.

Однако запросы, которые вы делаете, чтобы получить информацию, которая используется для принятия разрешенного определения, могут быть потенциально кэшированы. Для этого я бы рекомендовал использовать MemoryCache. Просто:

ObjectCache cache = MemoryCache.Default; 

... 

var foos = cache.Get("key") as List<Foo>; 
if (foos == null) 
{ 
    foos = repo.GetFoos(); 
    cache.Add("key", foos, new CacheItemPolicy 
    { 
     AbsoluteExpiration = DateTimeOffset.Now.AddHours(1) 
    }); 
} 

// do something with `foos` 

Это в основном, как это работает, но в такой среде, как Интернет, вам нужно подумать о параллелизме. Я написал post on my blog, который предоставляет расширение, чтобы сделать обработку этого намного проще.

2

Есть ли способ кэширования (так что я не должен постоянно запрашивать базу данных ) эти полномочия для длины времени, эквивалентного времени от момента, когда проверка сначала выполняются/кэшируются в конец семестр?

По умолчанию авторизованных ролей ASP.Net Идентификационных МАГАЗИНОВ пользователя внутри Роли претензии после успешной авторизации пользователя. Эти претензии хранятся в файле cookie до выхода пользователя из системы или закрытия браузера.

Невозможно реализовать дополнительное кэширование для атрибута authorize.

+1

Стоит отметить, что с точки зрения безопасности эти данные не хранятся в открытом тексте. Они хранятся в зашифрованном виде, как ASP.NET_SessionId = fegias ...; .AspNet.ApplicationCookie = QPHpjno5QPgbpt ... –

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