class Class1 {
static void Main(string[] args) {
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
try {
ShowMessage();
} catch (SecurityException exception) {
Console.WriteLine(
'Security exception caught (' + exception.Message + ')');
Console.WriteLine(
'The current principal must be in the local'
+ 'Users group');
}
}
(PrincipalPermissionAttribute(SecurityAction.Demaid, Role =
'BUILTIN\Users'));
static void ShowMessage() {
Console.WriteLine('The current principal is longed in locally');
Console.WriteLine('they are a member of the local Users group)');
}
}
}
Метод ShowMessage()
будет порождать исключение, если приложение выполняется не в контексте пользователя из группы локальных Users в Windows 2000. Что касается приложений Web, то учетная запись, под которой выполняется код ASP.NET, должна быть в группе, хотя в реальном мире определенно будут избегать добавления этой учетной записи в группу администраторов.
Если выполнить приведенный выше код с помощью учетной записи в локальной группе Users, то вывод будет таковым:
The current principal is logged in locally
(they are a member of the local Users group)
Дополнительную информацию о системе безопасности на основе ролей в .NET можно найти в документации MSDN для пространства имен System.Security.Principal
.
Управление политикой системы безопасности
Аспекты безопасности .NET разработаны значительно полнее и шире, чем какие-либо другие вопросы в Windows, но все же есть и которые ограничения, о которых необходимо знать:
□ Политика системы безопасности .NET не обеспечивает безопасность на неуправляемом коде (хотя обеспечивает некоторую защиту от обращении к неуправляемому коду).
□ Если пользователь копирует сборку на свою локальную машину, сборка имеет полномочия FullTrust
и, таким образом, политика безопасности не действует. Чтобы решить эту проблему, можно ограничить полномочия предоставляемые локальному коду.
□ Политик системы безопасности .NET предоставляет очень небольшую помощь при борьбе со злонамеренными файлами .ЕХЕ Win32 и вирусами на основе сценариев, с которыми Microsoft борется различными способами. Например недавние версии Outlook не позволяют обрабатывать исполнимые файлы из почтовых сообщений, пользователь предупреждается, что они могут содержать вирусы, и сохраняет их на диске, где имеются возможности для установки административных ограничений, включая блокирование доступа к локальному диску и работу антивирусного программного обеспечения.
Однако .NET существенно помогает операционной системе в ответах на вопросы, сколько полномочий предоставить коду, будет ли он приложением интранет, элементом управления на странице Web или приложением Windows Forms, загруженным от поставщика программного обеспечения в Интернете.
Конфигурационный файл системы безопасности
Как мы уже видели, общим звеном, соединяющим группы кода, полномочия и множества полномочий, являются три уровня политики системы безопасности (Enterprise, Machine и User). Информация о конфигурации системы безопасности в .NET хранится в конфигурационных файлах XML, которые защищены системой безопасности Windows. Например, политика безопасности уровня Machine распространяется только на пользователей групп Administrator, Power User и SYSTEM в Windows 2000.
В Windows 2000 файлы, которые хранят политику безопасности расположены в следующих местах:
Конфигурация политики предприятия
C:WinNTMicrosoft.NETFrameworkv1.0.xxxxConfigenterprise.config
Конфигурация политики машины
C:WinNTMicrosoft.NETFrameworkv1.0.xxxxConfigsecurity.config
Конфигурация политики пользователя
%USERPROFILE%application dataMicrosoftCLR security configvxx.xx security.config
Номер версии, отмеченный несколькими 'x', будет меняться в зависимости от версии .NET Framework, установленной на машине. При необходимости можно вручную редактировать эти конфигурационные файлы, например, если администратору нужно сконфигурировать политику для пользователя не регистрируясь в системе со своей учетной записью. Однако в общем рекомендуется использовать caspol.exe
или подключаемый модуль ММС для управления политикой системы безопасности.
Простой пример
Создадим небольшое приложение, обращающееся к локальному диску, поведение которого требует тщательного управления. Приложение относится к C# Windows Forms с окном списка и кнопкой. Если нажать на кнопку, то окно списка заполняется из файла с именем animals.txt
в корне диска C:
:

Приложение создается с помощью Visual Studio.NET, единственными изменениями в нем являются добавления к форме окна списка и кнопки Load Data, а также подключение к кнопке события, что выглядит следующим образом.
// Пример из SecurityAppl
private void button1_Click(object sender, System.EventArgs e) {
StreamReader stream = File.OpenText(@'C:animals.txt');
String str;
while ((str = stream.ReadLine()) != null) {
listBox1.Items.Add(str);