Класс SecurityPermission управляет "метаразрешениями", которые, в свою очередь, управляют подсистемой защиты общеязыковой среды выполнения CLR. Давайте снова обратимся к примеру RoleBasedSecurity, который уже рассматривали в этой главе. В нем с помощью метода AppDomain: : SetPrincipalPolicy задавалась политика принципалов для прикладных областей:
AppDomain *ap = AppDomain::CurrentDomain;
ap->SetPrincipalPolicy(
PrincipalPolicy::WindowsPrincipal);
Тип принципала, возвращаемый Thread: :CurrentPrincipal, будет зависеть от политики принципалов прикладной области. В перечислении System: : Security:: PrincipalPolicy определены следующие три политики опознавания для прикладной области:
Политику можно задавать с помощью метода SetPrincipalPolicy экземпляра AppDomain, относящегося к текущей прикладной области. Статический метод AppDomain: :CurrentDomain вернет текущий экземпляр. Этот метод должен вызываться перед любым вызовом Thread: :CurrentPrincipal. Дело в том, что объект принципала не создается до первой попытки доступа к этому свойству.
Чтобы при выполнении примера RoleBasedSecurity можно было задавать политику принципалов, у него должно быть право ControlPrincipal. С целью убедиться, что выполняемый код имеет такое право, перед изменением политики можно вызвать метод Demand (Требование) объекта SecurityPermission. Если у вас нужного разрешения нет, то будет запущено исключение SecurityException.
SecurityPermission *sp = new SecurityPermission( SecurityPermissionFlag::ControlPrincipal) ;
try
{
// Проверить, имеют ли все вызывающие программы выше в стеке
// вызовов разрешение управлять
// объектом принципала перед выполнением действий над ним.
sp->Demand();
}
catch(SecurityException *se)
{
// не может управлять объектом принципала
Console::WriteLine(se->Message); // Сообщение
return;
}