Architecture Net



         

Принципалы и личности


Каждый поток связан с принципалом общеязыковой среды выполнения CLR. Принципал содержит личность, которая представляет идентификатор пользователя, запускающего поток. Текущий принципал, связанный с вызываемым потоком, является значением статического свойства Thread: : CurrentPrincipal.
Объекты принципала реализуют интерфейс IPrincipal. Этот интерфейс обладает одним методом и одним свойством. Свойство Identity (Личность) возвращает текущий объект личности, а метод IsInRole используется, чтобы определять, находится ли данный пользователь в указанной роли. Использование принципалов, личностей и ролей показано в примере, который называется RoleBasedSecurity.
Сейчас в системе .NET имеется два класса принципалов: WindowsPrincipal и GenericPrincipal. GenericPrincipal полезен тогда, когда должен быть реализован ваш собственный принципал. Ну а класс WindowsPrincipal представляет пользователя Windows и связанные с ним роли.
В примере RoleBasedSecurity программа начинается с требования предоставить SecurityPermission для манипуляций с объектом принципала. Затем программа задает политику принципала AppDomain. SecurityPermission — класс разрешения, выдаваемого системой защиты. Этот класс устанавливает для разрешения определенный набор флажков. В текущем примере конструктор SecurityPermission принимает в качестве параметра Security PermissionFlag: :ControlPrincipal, указывающий на возможность управлять объектом принципала. Метод Demand (Требование) класса SecurityPermission вызывается для того, чтобы узнать, есть ли у нас разрешение, позволяющее манипулировать названным объектом принципала. Если есть, то тогда мы продолжаем менять политику этого принципала. Ну а если такого разрешения у нас нет, то Demand (Требование) запустит исключение SecurityException, и выполнение программы прекратится.

// определить право изменять политику принципала Console::WriteLine(
"Demanding right to change principal policy");
// "Требование права изменять политику принципала" SecurityPermission *sp = new SecurityPermission(
SecurityPermissionFlag::ControlPrincipal) ; try
{
// Проверить, всем ли вызывающим программам
// выше в стеке вызовов
// предоставлено разрешение управлять
// объектом принципала перед работой с ним.
sp->Demand(); // Запрос
}
catch(SecurityException *se)
{
//не может управлять объектом принципала
Console::WriteLine(se->Message); // Сообщение
return;
}




Содержание  Назад  Вперед