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

Требуемые полномочия

Требуемые полномочия

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

В следующем коде представлен конструктор формы, который создает объект FileIOPermission, вызывает его метод Demand() и затем обрабатывают результат:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Security;
using System.Security.Permissions;
namespace SecurityApp4 {
 public class Form1 : System.Windows.Forms.Form {
  private System.Windows.Forms.Button button1;
  private System.ComponentModel.Container components;
  public Form1() {
   InitializeComponent();
   try {
    FileIOPermission fileioperm = new
    FileIOPermission(FileIOPermissionAccess.AllAccess, @"C:");
    fileioperm.Demand();
   } catch {
    button1.Enabled = false;
   }
  }
  public override void Dispose() {
   base.Dispose();
   if(component != null) components.Dispose();
  }
#region Windows Form Designer generated code
  /// <summary>
  /// Требуемый метод для поддержки конструктора — не изменяйте
  /// содержимое этого метода с помощью редактора кода.
  /// </summary >
  private void InitializeComponent() {
   this.button1 = new System.Windows.Forms.Button();
   this.SuspendLayout();
   //
   // button1
   //
   this.button1.Location = new System.Drawing.Point(48, 104);
   this.button1.Name = "button1";
   this.button1.Size = new System.Drawing.Size(192, 23);
   this.button1.TabIndex = 0;
   this.button1.Text = "Button Requires FileIOPermission";
//
   // Form1
   //
   this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
   this.ClientSize = new System.Drawing.Size(292, 273);
   this.Controls.AddRange(new System.Windows.Forms.Control[] {this.button1});
   this.Name = "Form1";
   this.Text = "Form1";
   this.ResumeLayout(false);
  }
#endregion
  /// <summary>
  /// Основная точка входа для приложения.
  /// </summary >
  [STAThread]
  static void Main() {
   Application.Run(new Form1());
  }
 }
}

Можно заметить, что FileIOPermission содержится в пространстве имен System.Security.Permissions, которое имеет все множество полномочий, а также предоставляет классы для декларативных атрибутов полномочий и перечисления параметров, используемых при создании объектов прав (например, при создании FileIOPermission, определяющего, нужен нам полный доступ или только для чтения).

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


Но если скопировать исполняемый файл на сетевой диск общего доступа и снова его выполнить, то он будет действовать внутри множества полномочий LocalIntranet, которое блокирует доступ к локальной памяти, и кнопка будет неработоспособной (серой):


Если при нажатии на кнопку была реализована функциональность для доступа к диску, не требуется писать никакой код для системы безопасности, так как соответствующий класс в .NET Framework будет запрашивать полномочия файла и CLR гарантирует, что каждый вызывающий в стеке будет иметь эти полномочия, прежде чем продолжить. При выполнении приложения из интранет, которое пытается открыть файл на локальном диске, будет порождаться исключение при условии, что политика безопасности не была изменена.

При желании перехватывать исключения, порождаемые CLR, когда код пытается действовать вопреки предоставленным ему правам, можно перехватывать исключение типа SecurityException, которое предоставляет доступ к ряду полезных элементов информации, включая читаемую человеком трассировку стека (SecurityException.StackTrace) и ссылку на метод, порождающий исключение (SecurityException.TargetSite). SecurityException предоставляет также свойство SecurityException.PermissionType, возвращающее тип объекта Permission, который порождает исключения безопасности.

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


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