Личность кода. Классы разрешений для личности. Подтверждение.
Характеристики, по которым можно идентифицировать сборку, являются ее разрешениями для личности. В качестве примера можно указать строгое имя сборки или Web-узел, сгенерировавший тот или иной код. Общеязыковая среда выполнения CLR предоставляет разрешения для личности на основе подтверждения, предоставленного загрузчиком или надежным хостом.
Классы разрешений для личности
Идентифицировать работающий код можно с помощью нескольких классов разрешений для личности:
- PublisherldentityPermission моделирует цифровую подпись издателя программного обеспечения;
- SiteldentityPermission моделирует Web-узел, с которого поступил код;
- StrongNameldentityPermission моделирует строгое имя сборки;
- ZoneldentityPermission моделирует зону, из которой поступил код;
- URLIdentityPermission моделирует унифицированный указатель информационного ресурса (URL) и протокол, по которому принят код.
Эти разрешения представляют подтверждение, которое можно использовать для определения политики безопасности. Разрешения для личности – это не разрешения на доступ к коду.
Подтверждение
В основе политики безопасности лежат наборы правил, устанавливаемые администраторами. Защита .NET может использовать эти правила для проведения той или иной политики. С помощью подтверждения, представленного разрешениями для личности, определяется проводимая политика.
В классе AppDomain имеется функция ExecuteAssembly, которая заставляет сборку выполняться. Ее единственным аргументом является экземпляр класса Evidence (Подтверждение). Этот класс является коллекцией объектов, которая представляет личность сборки, и в то же время является коллекцией объектов, которые представляют подтверждение.
Сказанное иллюстрируется примером Evidence (Подтверждение). При его выполнении получится коллекция подтверждений, ассоциированная со строгим именем сборки, а также распечатаются соответствующие значения.
Evidence *ev = AppDomain::CurrentDomain › Evidence; lEnumerator *iEnum = ev › GetEnumerator(); bool bNext; // логическая (булева) переменная bNext Console::WriteLine( "Evidence Enumerator has {0} members", // "Перечисление Evidence имеет {0} членов " _box(ev › Count)}; bNext = iEnum › MoveNext(); while (bNext == true) // пока (bNext == истина) { Object *x = iEnum › Current; Type *t = x › GetType(); Console::WriteLine(t › ToString()); if (t == _typeof(Zone)) // если Зона { Zone *zone = dynamic_cast<Zone *>(x); // Зона Console::WriteLine( " {0}", _box(zone › SecurityZone)); // зона } else if (t == _typeof(Url)) // если Url { Url *url = dynamic_cast<Url *>(x); Console::WriteLine( " {0}", url › Value); // Значение } else if (t == _typeof(Hash)) { Hash *hash = dynamic_cast<Hash *>(x); unsigned char mdSHash _gc [] = hash › MD5; unsigned char shalHash _gc [] = hash › SHAl; Console::WriteLine( MD5 Hash of Assembly:"); Console::Write(" "); for(int i = 0; i < md5Hash › Length; i++) Console::Write(mdSHash[i]); // Запись Console::WriteLine(); Console::WriteLine( SHA1 Hash of Assembly:"); Console::Write(" "); // Запись forfint i = 0; i < shalHash › Length; i++) Console::Write(shalHash[i]); // Запись Console::WriteLine (); } else if (t == _typeof(StrongName)) { StrongName *sn = dynamic_cast<StrongName *>(x); Console::WriteLine( " StrongName of Assembly is: {0} version: {!}", // версия sn › Name, // Имя sn › Version); // Версия Console::WriteLine( " Assembly public key:"); Console::Write(// Запись "); Console::WriteLine(sn › PublicKey); } bNext = iEnum › MoveNext(); }