Личность в операционной системе и общеязыковой среде выполнения CLR. Разрешения коду на доступ.
Как уже говорилось в начале этой главы, защита .NET строится поверх системы защиты операционной системы компьютера. Личность, связываемая с потоком при помощи общеязыковой среды выполнения CLR, и личность, связываемая с потоком при помощи операционной системы – это не одно и то же. В операционной системе личность потока представлена значением объекта Windows Identity, возвращаемого статическим методом Windowsldentity::GetCurrent. Ну, а личность в общеязыковой среде выполнения CLR представлена значением объекта Thread::CurrentPrincipal. Если вернуться к примеру, о котором говорилось в начале этой главы, то личности, как управляемые, так и неуправляемые, при доступе к файлу из.NET должны иметь на него права внутри соответствующих сред.
Значения текущего Windowsldentity и текущего Thread::CurrentPrincipal задаются в двух разных местах: это параметры информационного сервера Internet (IIS) и конфигурационные файлы ASP.NET.
Разрешения коду на доступ
Для доступа к ресурсу, такому, например, как файл, или для выполнения определенной операции коду требуются разрешения Некоторые разрешения даются каждой сборке политикой безопасности (о которой еще пойдет речь в этой главе). Разрешения коду на доступ могут запрашиваться самим кодом. И тогда, исходя из политики безопасности для той или иной сборки, общеязыковая среда выполнения CLR будет решать, какие разрешения следует предоставить. О том, как писать нестандартное разрешение, мы говорить не будем.
Вот некоторые примеры разрешений коду на доступ:
- DNSPermission управляет доступом к имеющимся в сети серверам доменных имен;
- EnvironmentPermission управляет доступом на чтение или запись переменных среды;
- FilelOPermission управляет доступом к файлам и каталогам;
- FileDialogPermission позволяет читать файлы, выбранные в диалоговом окне Open (Открыть). Полезно тогда, когда FilelOPermission не предоставлено;
- ReflectionPermission управляет возможностями получения доступа к метаданным, не являющимся общедоступными, и способностью порождать метаданные,
- RegistryPermission управляет возможностью получать доступ к системному реестру и изменять его,
- SecurityPermission управляет использованием подсистемы защиты,
- SocketPermission управляет возможностью устанавливать соединения или принимать их по транспортному адресу;
- UlPPermission управляет пользователями различных средств пользовательского интерфейса, в том числе и буферами обмена;
- WebPermission управляет возможностью устанавливать соединения или принимать их по Web-адресу.
Использование этих разрешений называется защитой доступа для кода (Code Access Security), потому что в их основе лежит не личность пользователя, выполняющего код, а то, имеет ли сам код право предпринять некоторое действие.