Иллюстрированный самоучитель по Architecture .NET

Личность кода. Классы разрешений для личности. Подтверждение.

Характеристики, по которым можно идентифицировать сборку, являются ее разрешениями для личности. В качестве примера можно указать строгое имя сборки или 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(); }
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.