Richiesta di autorizzazioni facoltative

Il flag SecurityAction.RequestOptional consente di richiedere un set di autorizzazioni e di rifiutare tutte le altre autorizzazioni proposte dal runtime. Il flag RequestRefuse consente di rifiutare le autorizzazioni specificando in modo esplicito quelle che non devono essere concesse al codice.

A differenza dell'utilizzo del flag RequestMinimum, l'applicazione viene eseguita se non riceve tutte le autorizzazioni richieste tramite il flag RequestOptional e viene generata una SecurityException quando si tenta di accedere a una risorsa protetta. Se si utilizza questo tipo di richiesta, è necessario che il codice sia in grado di intercettare le eventuali eccezioni generate nel caso in cui l'autorizzazione facoltativa non venga concessa.

Nell'esempio riportato di seguito viene inviata una richiesta di FileIOPermission utilizzando il flag SecurityAction.RequestOptional e rifiutando indirettamente tutte le altre autorizzazioni. In questo esempio si presuppone l'esistenza di una classe Log fittizia in LogNameSpace. Nella classe Log è contenuto il metodo MakeLog che crea un nuovo file di log sul computer locale. Nell'applicazione viene creata una nuova istanza della classe Log ed eseguito il metodo MakeLog all'interno del blocco try. Mediante la parola chiave catch viene intercettata ogni SecurityException generata e viene visualizzato un messaggio.

Imports System
Imports System.Security
'The hypothetical class log is in this namespace.
Imports LogNameSpace
Imports System.Security.Permissions
'The request is placed on 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     
[C#]
//The request is placed on 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.");
         }
      }
   }
}

Mediante il codice appena esaminato viene creato un file di log e, se al codice sono state concesse autorizzazioni sufficienti, viene visualizzato alla console il seguente messaggio:

The Log has been created.

Se il codice viene eseguito da una condivisione e le impostazioni di protezione locale non consentono che disponga di FileIOPermission, a tale codice non verrà concessa la necessaria autorizzazione e verrà visualizzato il seguente messaggio:

This application does not have permission to write to the disk.

Vedere anche

Estensione di metadati mediante attributi | Richiesta di autorizzazioni | Protezione dall'accesso di codice | SecurityAction | FileIOPermission | UIPermission