Итак, я прочитал о том, как плохо реализованы ваши собственные процедуры авторизации!
http://www.nashcoding.com/2011/02/05/using-the-forms-authentication-membership-provider-on-appharbor/
И я испугался, потому что я реализовывал свои действия как таковые (например, предотвращениедоступ к данным учетной записи, если аутентифицированный пользователь не является вошедшим в систему пользователем)
public ActionResult DisplayAccount(int someid){
Account a = context.Accounts.Single(a => a.id == someid);
// currentUserId() returns userid from FormsAuthentication
if (!a.owner == currentUserId()){
/* Not Authorised! */
}
}
Это, очевидно, означает, что он прекратит работу, если ASP решит кэшировать мое действие (поэтому действие даже не будет выполнено).
Итак, я сейчас изучаю использование AuthorizeAttribute для того, что мне нужно сделать, а именно:
- запретить доступ к действию, если не аутентифицирован
- проверить, авторизован ли пользовательимеет доступ к найденному ресурсу
Однако всякий раз, когда я думаю об этом, я не могу думать о том, как реализовать 2-й пункт.Роли не работают, потому что на уровне сайта, но внутри приложения пользователи также имеют роли (например, владелец, модератор, участник, пользователь и т. Д.), И они имеют эти роли только в соответствующих частях приложения (например, владелец темы, автор вики, модератор форума и т. д.)
Я столкнулся с несколькими примерами переопределения AuthorizeCore.Я могу себе представить, как создать несколько подклассов AuthorizeAttribute для каждого имеющегося у меня ресурса (к счастью, не многих), но означает ли это, что мне приходится запрашивать базу данных каждый раз, когда я нажимаю на это действие, чтобы гарантировать, что зарегистрированный пользователь долженв состоянии получить доступ к этим данным, а затем запросить базу данных в моем действии, чтобы получить модель, вместо того, чтобы делать это в моем запросе?
Итак, мои вопросы
- Я слишком волнуюсьо кешировании слишком много?Произойдет ли что-либо из следующего:
- веб-сайт кэширует данные пользователя A, отображаемые на экране пользователя B?
- веб-сайт кэширует версию страницы администратора (с элементами управления редактированием), и обычный пользователь видит кэшированныйверсия?
- Использование AuthorizeAttribute само собой разумеющееся, но как мне добиться того, что мне нужно сделать в пункте 2, не обращаясь к базе данных перед действием?Или каков наилучший способ добиться этого в любом случае.
- Или я использую только AuthorizeAttribute, чтобы определить, вошел ли пользователь в систему, и выполнить другую логику проверки в моих действиях?
Во всяком случае, я надеюсь, что этот пост не идет по каким-либо старым путям (я не мог найти ничего по этому, что я нашел окончательный)
Редактировать: я думаю, если я не включаюКэширование этой проблемы не произойдет, верно?
Редактировать: сейчас я собираюсь использовать vanilla AuthorizeAttribute, затем проверять доступ к уровню ресурсов в моих действиях, а затем убедиться, что я неНе используйте кэширование для любых аутентифицированных действий.Надеемся, что получит больше ответов на это в течение недели.