Практическое руководство. Запрос необязательных разрешений с помощью флага RequestOptional
Обновлен: Ноябрь 2007
Флаг SecurityAction.RequestOptional позволяет запрашивать набор разрешений, отклоняя все остальные разрешения, которые в противном случае среда выполнения может попытаться выдать. И наоборот, флаг RequestRefuse позволяет отклонять разрешения, явно указывая, какие из них не должны выдаваться вашему коду.
В отличие от использования флага RequestMinimum, приложение будет выполняться, даже если не получит всех разрешений, которые запрашиваются с использованием флага RequestOptional, а в случае если приложение попытается осуществить доступ к защищенному ресурсу, произойдет исключение SecurityException. Если используется этот тип запроса, необходимо обеспечить в коде перехват всех исключений, которые будут созданы, если коду не будет выдано дополнительное разрешение.
В следующем примере разрешение FileIOPermission запрашивается с использованием флага SecurityAction.RequestOptional, неявно отклоняя все остальные разрешения. В этом примере предполагается, что в пространстве имен LogNameSpace существует гипотетический класс Log. Класс Log содержит метод MakeLog , создающий новый лог-файл на локальном компьютере. Это приложение создает новый экземпляр класса Log, после чего вызывает метод MakeLog внутри блока try. Используя зарезервированное слово catch, оно перехватывает любые созданные исключения SecurityException и отображает сообщение.
Пример
Imports System
Imports System.Security
'The hypothetical class log is in this namespace.
Imports LogNameSpace
Imports System.Security.Permissions
'The request is placed at the assembly level.
<assembly: FileIOPermission(SecurityAction.RequestOptional, Unrestricted := True)>
Namespace MyNamespace
Public Class MyClass1
Public Sub New()
End Sub
'Entry point that delegates to C-style main Private Function.
Public Overloads Shared Sub Main()
Main(System.Environment.GetCommandLineArgs())
End Sub
Overloads Public Shared Sub Main(args() As String)
'Put any code that requires optional permissions in the try block.
Try
Dim MyLog As New Log()
MyLog.MakeLog()
Console.WriteLine("The Log has been created.")
'Catch the security exception and inform the user that the
'application was not granted FileIOPermission.
Catch
Console.WriteLine("This application does not have permission to write to the disk.")
End Try
End Sub
End Class
End Namespace
//The request is placed at the assembly level.
using System.Security.Permissions;
[assembly:FileIOPermission(SecurityAction.RequestOptional, Unrestricted = true)]
namespace MyNamespace {
using System;
using System.Security;
//The hypothetical class log is in this namespace.
using LogNameSpace;
public class MyClass {
public MyClass() {
}
public static void Main(string[] args) {
//Put any code that requires optional permissions in the try block.
try {
Log MyLog = new Log();
MyLog.MakeLog();
Console.WriteLine("The Log has been created.");
}
//Catch the security exception and inform the user that the
//application was not granted FileIOPermission.
catch(SecurityException) {
Console.WriteLine("This application does not have permission to write to the disk.");
}
}
}
}
Вышеприведенный код создает лог-файл и отображает на консоли следующее сообщение, если располагает достаточными правами:
The Log has been created.
Если код запускается с общего сетевого ресурса и локальные параметры безопасности не позволяют такому коду иметь разрешение FileIOPermission, код не получает достаточных разрешений и отображает следующее сообщение:
This application does not have permission to write to the disk.