Чаще всего проверки PrincipalPermission используются в дополнение к правилам web.config для повышения отказоустойчивости. Другими словами, вы можете вызывать метод Demand() для того, чтобы гарантировать, что если файл web.config был преднамеренно модифицирован, пользователи из "неправильных" групп допущены не будут.
Подход с PrincipalPermission также предоставляет вам возможность оценивать, более сложные правила аутентификации. Например, рассмотрим ситуацию, когда пользователям UserA и UserB, принадлежащим к разным группам, открыт доступ к определенной функциональности. Если вы используете объект IPrincipal, то вам придется вызывать IsInRole() дважды. Альтернативный подход заключается в создании нескольких объектов PrincipalPermission и слиянии их в другой объект PrincipalPermission, с последующим вызовом Demand(). Вот пример комбинации двух правил:
try
{
PrincipalPermission pp1 =
new PrincipalPermission(null, @"BUILTIN\Administrators");
PrincipalPermission pp2 =
new PrincipalPermission(null, @"BUINTIN\Guests");
// Скомбинировать эти два разрешения.
PrincipalPermission рр3 = (PrincipalPermission)pp1.Union(pp2);
рр3.Demand();
// Если управление достигло этой точки, требование удовлетворено.
// Текущий пользователь принадлежит к одной из этих ролей.
}
catoh (SecurityException err)
{
// Требование не удовлетворено.
// Текущий пользователь не относится ни к одной из ролей.
}
Этот пример проверяет пользователя на принадлежность к одной из двух групп Windows — Administrators или Guests. Вы также можете проверять на принадлежность пользователя к обеим группам одновременно. В этом случае вместо метода Union() необходимо применить Intersect().
Атрибут PrincipalPermissionAttribute предоставляет другой способ проверки удостоверения текущего пользователя. Он служит той же цели, что и класс PrincipalPermission, но используется декларативно. Другими словами, вы присоединяете его к данному классу или методу, a CLR проверяет его автоматически, когда происходит обращение к соответствующему коду. В этом случае обработка исключений работает несколько иначе: на этот раз вы не можете перехватить исключение внутри функции, к которой относится атрибут. Вы должны это сделать в функции, которая вызывает данную. Если вы применяете атрибут PrincipalPermissionAttribute к процедуре события (такой как Button_Click), то, должны перехватить исключение в глобальном обработчике события Application_Error, которое можно найти в файле global.asax.
предыдущая следующая страница вначало главы оглавление
935