Architecture Net

         

Класс SecurityPermission


Класс SecurityPermission управляет "метаразрешениями", которые, в свою очередь, управляют подсистемой защиты общеязыковой среды выполнения CLR. Давайте снова обратимся к примеру RoleBasedSecurity, который уже рассматривали в этой главе. В нем с помощью метода AppDomain: : SetPrincipalPolicy задавалась политика принципалов для прикладных областей:

AppDomain *ap = AppDomain::CurrentDomain;
ap->SetPrincipalPolicy(
PrincipalPolicy::WindowsPrincipal);

Тип принципала, возвращаемый Thread: :CurrentPrincipal, будет зависеть от политики принципалов прикладной области. В перечислении System: : Security:: PrincipalPolicy определены следующие три политики опознавания для прикладной области:

  • WindowsPrincipal применяет текущего пользователя, связанного с потоком. Thread: : CurrentPrincipal возвращает объект WindowsPrincipal;
  • UnauthenticatedPrincipal применяет неаутентифицированного пользователя. Thread: :CurrentPrincipal возвращает объект GenericPrincipal. Это политика, задаваемая по умолчанию;
  • NoPrincipal возвращает пустой указатель (null) для Thread: : CurrentPrincipal.
  • Политику можно задавать с помощью метода 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;
    }




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