AuthorizeAttribute MVC - ограничить доступ к пользовательскому контенту - PullRequest
2 голосов
/ 13 октября 2011

Итак, я прочитал о том, как плохо реализованы ваши собственные процедуры авторизации!

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, затем проверять доступ к уровню ресурсов в моих действиях, а затем убедиться, что я неНе используйте кэширование для любых аутентифицированных действий.Надеемся, что получит больше ответов на это в течение недели.

1 Ответ

1 голос
/ 13 октября 2011

Я использовал следующий подход в недавнем проекте, создавая DataRightsAttribute, который использовал перечисление для каждого поддерживаемого типа модели.Он работает, сначала извлекая идентификатор из данных маршрута, набора форм или строки запроса.Затем он запросил тип модели, определенный перечислением, и провел соответствующую проверку, чтобы определить, авторизован ли текущий пользователь для доступа к нему.

Использование было таким:

[DataRights(ModelType.Customer)]

Этоиспользовался вместе с AuthorizeAttribute (который мы переопределили) и никогда не замечал никаких проблем с кэшированием.

...