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

Утверждение разрешений. Другие методы разрешений.

Метод Assert Утвердить) позволяет вам требовать разрешение, даже если у вас нет соответствующих прав доступа. Вам также может потребоваться утвердить разрешение еще и потому, что, хотя ваша сборка и обладает нужным правом, но другие вызовы из цепочки вызовов его не имеют. Утверждать вы можете только те разрешения, которые предоставлены вашей сборкой. Если бы это было не так, то обойти защиту общеязыковой среды выполнения было бы очень легко.

При выполнении примера SimplePermissionCodeDenial утверждается разрешение FilelOPermission и делается попытка чтения файла.

fileIOPerm › Deny();
fileIOPerm › Assert();
ReadFilet);
ReadFileWithAssert(filelOPerm);
ReadFile();

Но прочитать файл не удается! Утверждение действует только в вызванном методе. Метод ReadFileWithAssert может читать файл потому, что утверждает разрешение во время своего выполнения, а затем пытается выполнить чтение. Метод Assert (Утвердить) останавливает просмотр стека разрешений, и потому выше стекового фрейма разрешения не проверяются, так что выполнение действия будет продолжено, но самих разрешений метод не выдает. Поэтому если код, расположенный ниже стекового фрейма (такой, как ReadFile), пытается требовать разрешение, в котором было отказано (так делает конструктор Filelnfo), то будет запущено исключение SecurityException. Аналогично, Deny (Запретить) не дает выполнять действие тем вызывающим программам, которые расположены выше в стековом фрейме, а не на текущем уровне.

.static void ReadFileWithAssert(FilelOPermission *f)
{
try {
f › Assert(); Console::WriteLine(
"File Permission Asserted in same procedure as read.");
// "Разрешение Файла, утвержденное
// в той же самой процедуре, что и чтение.
" Filelnfo *file = new Filelnfo(filename);
// имя файла
StreamReader *sr = file › OpenText();
// файл
String *text;
// Строка
text = sr › ReadLine(); // текст
while (text!= 0)
{
Console::WriteLine(" {0}", text); // текст
text = sr › ReadLine(); // текст
}
sr › Close();
}
catch(SecurityException *se)
{
Console::WriteLine(
"Could not read file: {0}", se › Message); // Сообщение
// "He смог прочитать файл: "
}
}

Не забывайте, что Assert (Утвердить) применяется только к операциям ввода-вывода, выполняемым в данной программе для указанного файла, который передается конструктору FilelOPermission. Вызов Assert (Утвердить) действует до тех пор, пока не завершится выполнение кода, в котором он находится. Следовательно, попытка выполнить ReadFile будет неудачной, если она делается после завершения ReadFileWithAssert. RevertAssert удаляет все текущие запросы Assert (Утвердить).

Метод Assert (Утвердить) создает бреши в защите, ведь какая-нибудь вызывающая программа из стекового фрейма вполне может использовать программу, которая вызывает этот метод как раз для нарушения безопасности. Любое использование Assert (Утвердить) должно рассматриваться с позиций защиты.

Запустите программу SimplePermissionCodeDenial и понаблюдайте за ее выводом.

Другие методы разрешений

PermitOnly указывает разрешения, которые должны быть успешными. Вы указываете, к каким ресурсам вам нужен доступ. Вызов PermitOnly действует до тех пор, пока не завершится выполнение кода, в котором он находится, или до следующего вызова этого метода. RevertPermitOnly удаляет все текущие запросы PermitOnly. RevertAll отменяет результаты выполнения Deny (Запретить), PermitOnly и Assert (Утвердить).

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.