или множество полномочий к уровню пользователя или предприятия, эти ограничения будут налагаться на все полномочия и, возможно, переопределять права на уровне машины. Действующие полномочия являются пересечением, поэтому, например, если необходимо применить FullTrust
к группе кода, это полномочие должно быть присвоено группе кода на каждом из трех уровней политики.
При выполнении caspol.exe
администратором по умолчанию используется уровень машины, но если выйти из системы и зарегистрироваться как пользователь, который не принадлежит группе пользователей Administrator
, caspol.exe
выберет по умолчанию уровень пользователя. Кроме того, caspol.exe
не позволит изменить политику безопасности таким образом, чтобы сделать саму утилиту caspol.exe
неработоспособной.
Теперь мы получили общее представление об архитектуре безопасности в .NET и можем перейти к обсуждению, как получить доступ к ее свойствам программным путем.
Поддержка безопасности в .NET
Чтобы система безопасности .NET работала, программистам необходимо доверить CLR обеспечение политики безопасности. Как это сделать? Когда вызывается метод, требующий специальных полномочий (например, доступ к файлу на локальном диске), CLR будет просматривать стек с целью гарантии того, что участник цепочки вызовов имеет требуемые права.
Слово 'производительность' уже, вероятно, обеспокоило вас в данный момент, и понятно, что ее повышение — это проблема, но чтобы получить преимущества управляемой среды .NET, приходится платить за безопасность. Иначе сборки, не являющиеся полностью надежны ни, могли бы делать обращения к надежным сборкам и система была бы открыта для атаки.
Для справки, наиболее применимыми в этой главе частями библиотеки .NET Framework являются:
□ System.Security.Permissions
□ System.Security.Policy
□ System.Security.Principal
Отметим, что система безопасности доступа к коду на основе свидетельства работает в паре с системой безопасности регистрации в Windows. Если вы захотите выполнить приложение для настольного компьютера .NET, то ему должны быть предоставлены соответствующие полномочия системы безопасности доступа к коду .NET, но регистрирующийся пользователь должен также работать под учетной записью Windows, которая имеет соответствующие права для выполнения кода. В применении к настольным приложениям это означает, что текущему пользователю должны быть предоставлены соответствующие права для доступа к соответствующим файлам сборки на диске. Для приложений Интернета учетная запись, с которой работает Информационный сервер Интернет, должна иметь доступ к файлам сборки.
Требуемые полномочия
Создадим приложение 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);