Главное разрешение на PageLoad - PullRequest
2 голосов
/ 14 октября 2011

Я новичок в использовании возможностей членства в Asp.NET, и я хочу знать, будет ли хорошей практикой отказывать в доступе к целой странице, используя такой код:

public partial class AdminPage : Page
{
   [PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
   protected void Page_Load(object sender, EventArgs e)
   {
      ...
   }
}

Я подозреваю, что это плохой способ сделать что-то, но я хотел бы знать, почему!

Спасибо.

Ответы [ 2 ]

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

Маленькая точка - поместите атрибут в класс.Это приведет к тому, что на странице появится исключение безопасности, как только вы перейдете к нему без соответствующих прав.Чтобы пользователи не могли просматривать эту страницу, проверьте их учетные данные перед отображением URL-адреса.Атрибут класса является надежной гарантией того, что ни один обычный пользователь не будет выполнять столько строк кода в этом классе.

Да, это хорошая методика по этим причинам:

Атрибут работает, когда задан принцип потока и объект HttpContext User, с подходящими IPrincipal и IIdentity.(Все это может произойти в событии Request Authentication в глобальном asax). Эти интерфейсы определены Microsoft, хорошо документированы и доступны в любом контексте, в любом приложении, работающем в операционной системе MS.Таким образом, любой наполовину компетентный разработчик, которого вы схватите с улицы, может быть знаком с этим до того, как он начнет читать ваш код.

Кроме того, поскольку Thread IPrincipal и IIdentity используются Microsoft (это могла быть любая крупная компания сбольшая база пользователей), это проверенный в бою код.Вы все еще можете сделать что-то глупое, но существующие шаблоны помогут вам попасть в пропасть успеха.

С другой стороны, если вы помещаете пользовательский объект в Session, волшебное печенье или другоеТаким образом, разработчик программного обеспечения должен будет узнать, как он работает с нуля, а затем проверить его на предмет наличия уязвимостей, которые можно использовать.

0 голосов
/ 14 октября 2011

Я думаю, вам понадобится базовый класс для всех ваших страниц, например:

public abstract class BasePage : Page
{
    // Note:
    // 1. check on init, not on load
    // 2. override protected method, not handle event
    protected override OnInit(EventArgs e)
    {
        // check permissions here
    }
}
...