Книга: C# для профессионалов. Том II

Отказ от полномочий

Отказ от полномочий

Существуют ситуации, когда необходимо быть абсолютно уверенным, что вызываемый метод действует в защищенном окружении, где он не может сделать ничего неблагоприятного. Предположим, нужно сделать вызов класса независимого поставщика и при этом точно знать, что он не получит доступ к локальному диску.

Чтобы достичь этого, создается экземпляр полномочия, который не должен получить метод а затем перед вызовом класса вызывается метод Deny():

using System;
using System.IO;
using System.Security;
using System.Security.Permissions;
namespace SecurityApp6 {
 class Class1 {
  static void Main(string[] args) {
CodeAccessPermission permission =
    new FileIOPermission(FileIOPermissionAccess.AllAccess, @"C:");
   permission.Deny();
   UntruscworthyClass.Method();
   CodeAccessPermission.RevertDeny();
  }
 }
 class UntrustworthyClass {
  public static void Method() {
   try {
    StreamReader din = File.OpenText(@"C:textfile.txt");
   }
   catch {
    console.WriteLine("Failed to open file");
   }
  }
 }
}

Если выполнить этот код, то будет выведено сообщение Failed to open file, так как ненадежный класс не имеет доступа к локальному диску.

Отметим, что вызов Deny() делается на экземпляре класса полномочия, в то время как вызов RevertDeny() выполняется статически. Причина этого заключается в том, что вызов RevertDeny() возвращает в прежнее состояние все запросы Deny() в рамках текущего стека. Таким образом, если было сделано несколько вызовов Deny(), то необходимо сделать только один последующий вызов RevertDeny().

Оглавление книги


Генерация: 4.093. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз