Sicurezza con attendibilità parziale in WPF

In generale, sarebbe opportuno limitare l'accesso diretto alle risorse critiche del sistema da parte delle applicazioni Internet in modo da impedire qualsiasi danno. Per impostazione predefinita, i linguaggi di scripting HTML e lato client non sono in grado di accedere alle risorse critiche del sistema. Dal momento che le applicazioni Windows Presentation Foundation (WPF) ospitate dal browser possono essere avviate dal browser, devono essere conformi a una serie di limitazioni dello stesso tipo. Per attivare queste limitazioni, WPF si basa su Code Access Security (CAS) e su ClickOnce (vedere Strategia di sicurezza di WPF - Sicurezza della piattaforma). Per impostazione predefinita, le applicazioni ospitate dal browser richiedono il set di autorizzazioni CAS dell'area Internet, a prescindere dal fatto che vengano avviate da Internet, dalla Intranet locale o dal computer locale. Le applicazioni in esecuzione con un set di autorizzazioni incompleto vengono definite come applicazioni in esecuzione con attendibilità parziale.

In WPF viene fornito ampio supporto per garantire l'utilizzo del maggior numero possibile di funzionalità in modo sicuro con attendibilità parziale e, tramite CAS, supporto aggiuntivo per la programmazione con attendibilità parziale.

Di seguito sono elencate le diverse sezioni di questo argomento:

  • Supporto con attendibilità parziale della funzionalità WPF

  • Programmazione con attendibilità parziale

  • Gestione delle autorizzazioni

Supporto con attendibilità parziale della funzionalità WPF

Nella tabella seguente sono elencate le funzionalità di livello elevato di Windows Presentation Foundation (WPF) che è possibile utilizzare in modo sicuro entro i limiti del set di autorizzazioni dell'area Internet.

Tabella 1: Funzionalità WPF sicure in attendibilità parziale

Area funzionalità

Funzionalità

Generale

Finestra del browser

Accesso al sito di origine

IsolatedStorage (limite di 512 KB)

Provider UIAutomation

Esecuzione di comandi

IME (Input Method Editor)

Stilo e input penna di Tablet PC

Trascinamento della selezione simulato mediante eventi del mouse capture e move

OpenFileDialog

Deserializzazione XAML (mediante XamlReader.Load)

Integrazione Web

Finestra di dialogo di download del browser

Esplorazione di primo livello avviata dall'utente

mailto:links

Parametri URI (Uniform Resource Identifier)

HTTPWebRequest

Contenuto WPF ospitato in IFRAME

Hosting di pagine HTML dello stesso sito utilizzando Frame

Hosting di pagine HTML dello stesso sito utilizzando WebBrowser

Servizi Web (ASMX)

Servizi Web (mediante Windows Communication Foundation)

Scripting

DOM (Document Object Model)

Visiva

2D e 3D

Animazione

Elementi multimediali (sito di origine e tra domini)

Immagini/Audio/Video

Lettura

Oggetti FlowDocuments

Documenti XPS

Tipi di carattere incorporati e di sistema

Caratteri CFF e TrueType

Modifica

Controllo ortografico

RichTextBox

Supporto Appunti per testo non crittografato e input penna

Operazione Incolla avviata dall'utente

Copia di contenuto selezionato

Controlli

Controlli generici

Nella tabella sono incluse le funzionalità WPF di livello elevato. Per informazioni più dettagliate, consultare la documentazione disponibile in Windows Software Development Kit (SDK) sulle autorizzazioni necessarie per ciascun membro di WPF. Inoltre, le seguenti funzionalità contengono informazioni più dettagliate sull'esecuzione in situazioni di attendibilità parziale, con alcune considerazioni speciali.

Nella tabella seguente sono elencate le funzionalità WPF che non è possibile utilizzare in modo sicuro entro i limiti del set di autorizzazioni dell'area Internet.

Tabella 2: Funzionalità WPF non sicure in attendibilità parziale

Area funzionalità

Funzionalità

Generale

Finestra (finestre e finestre di dialogo definite dall'applicazione)

SaveFileDialog

File system

Accesso al Registro di sistema

Trascinamento della selezione

Serializzazione XAML (mediante XamlWriter.Save)

Client UIAutomation

Accesso alla finestra di origine (HwndHost)

Supporto vocale completo

Interoperabilità con Windows Form

Visiva

Effetti bitmap

Codifica delle immagini

Modifica

Appunti RTF (Rich-Text Format)

Supporto XAML completo

Programmazione con attendibilità parziale

Per applicazioni XBAP, il codice che supera il set di autorizzazioni predefinito avrà un comportamento diverso a seconda dell'area di sicurezza. In alcuni casi, l'utente riceverà un avviso quando si tenta di installare il codice. L'utente potrà scegliere se continuare o annullare l'installazione. Nella tabella che segue viene descritto il comportamento dell'applicazione per ogni area di sicurezza e le azioni necessarie relative all'applicazione per acquisire attendibilità totale.

Area di sicurezza

Comportamento

Acquisizione di attendibilità totale

Computer locale

Attendibilità totale automatica

Nessuna azione necessaria.

Intranet e siti attendibili

Richiesta di attendibilità totale

Firma dell'applicazione XBAP con un certificato in modo che l'utente veda l'origine nel prompt.

Internet

Esito negativo con Attendibilità non concessa

Firma dell'applicazione XBAP con un certificato.

NotaNota

Il comportamento descritto nella tabella precedente è relativo alle applicazioni XBAP con attendibilità totale che non seguono il modello di distribuzione attendibile di ClickOnce.

In genere, è probabile che il codice che richiede autorizzazioni ulteriori rispetto a quelle consentite sia codice comune condiviso dalle applicazioni autonome e da quelle ospitate dal browser. In CAS e in WPF vengono fornite varie tecniche per la gestione di uno scenario di questo tipo.

Rilevamento delle autorizzazioni tramite CAS

In alcune situazioni, è possibile che il codice condiviso degli assembly di librerie sia utilizzato dalle applicazioni autonome e dalle XBAPs. In questi casi, è possibile che il codice esegua funzionalità che potrebbero richiedere un numero di autorizzazioni maggiore rispetto al set assegnato all'applicazione. L'applicazione consente di rilevare automaticamente se sono disponibili determinate autorizzazioni utilizzando le funzionalità di sicurezza di Microsoft .NET Framework. In modo specifico, è possibile verificare la disponibilità di una determinata autorizzazione chiamando il metodo Demand sull'istanza dell'autorizzazione desiderata. Tale procedura viene mostrata nell'esempio seguente, in cui il codice esegue una query per verificare la disponibilità dell'autorizzazione a salvare un file sul disco locale:


Imports System.IO ' File, FileStream, StreamWriter
Imports System.IO.IsolatedStorage ' IsolatedStorageFile
Imports System.Security ' CodeAccesPermission, IsolatedStorageFileStream
Imports System.Security.Permissions ' FileIOPermission, FileIOPermissionAccess
Imports System.Windows ' MessageBox

Namespace SDKSample
    Public Class FileHandling
        Public Sub Save()
            If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then
                ' Write to local disk
                Using stream As FileStream = File.Create("c:\newfile.txt")
                Using writer As New StreamWriter(stream)
                    writer.WriteLine("I can write to local disk.")
                End Using
                End Using
            Else
                MessageBox.Show("I can't write to local disk.")
            End If
        End Sub

        ' Detect whether or not this application has the requested permission
        Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean
            Try
                ' Try and get this permission
                requestedPermission.Demand()
                Return True
            Catch
                Return False
            End Try
        End Function



...


    End Class
End Namespace
using System.IO; // File, FileStream, StreamWriter
using System.IO.IsolatedStorage; // IsolatedStorageFile
using System.Security; // CodeAccesPermission, IsolatedStorageFileStream
using System.Security.Permissions; // FileIOPermission, FileIOPermissionAccess
using System.Windows; // MessageBox

namespace SDKSample
{
    public class FileHandling
    {
        public void Save()
        {
            if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt")))
            {
                // Write to local disk
                using (FileStream stream = File.Create(@"c:\newfile.txt"))
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    writer.WriteLine("I can write to local disk.");
                }
            }
            else
            {
                MessageBox.Show("I can't write to local disk.");
            }
        }

        // Detect whether or not this application has the requested permission
        bool IsPermissionGranted(CodeAccessPermission requestedPermission)
        {
            try
            {
                // Try and get this permission
                requestedPermission.Demand();
                return true;
            }
            catch
            {
                return false;
            }
        }



...


    }
}

Se un'applicazione non dispone dell'autorizzazione desiderata, la chiamata al metodo Demand genera un'eccezione di sicurezza. In caso contrario, l'autorizzazione è disponibile. IsPermissionGranted incapsula questo comportamento e restituisce true o false a seconda dei casi.

Riduzione normale delle prestazioni della funzionalità

La capacità del codice di rilevare le autorizzazioni di cui dispone risulta particolarmente interessante nel caso in cui il codice può essere eseguito da aree diverse. Sebbene il rilevamento dell'area sia importante, è meglio fornire un'alternativa all'utente, se possibile. Ad esempio, di solito un'applicazione con attendibilità totale consente agli utenti di creare file in qualsiasi posizione, mentre un'applicazione con attendibilità parziale consente di creare file unicamente in uno spazio di memorizzazione isolato. Se il codice per la creazione di un file è contenuto in un assembly condiviso da applicazioni con attendibilità totale (autonome) e applicazioni con attendibilità parziale (ospitate dal browser) e si desidera che entrambi i tipi di applicazioni consentano la creazione di file, il codice condiviso dovrà rilevare se viene eseguito in attendibilità parziale o totale prima di creare un file nel percorso appropriato. I due casi sono illustrati nel codice riportato di seguito.


Imports System.IO ' File, FileStream, StreamWriter
Imports System.IO.IsolatedStorage ' IsolatedStorageFile
Imports System.Security ' CodeAccesPermission
Imports System.Security.Permissions ' FileIOPermission, FileIOPermissionAccess
Imports System.Windows ' MessageBox

Namespace SDKSample
    Public Class FileHandlingGraceful
        Public Sub Save()
            If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then
                ' Write to local disk
                Using stream As FileStream = File.Create("c:\newfile.txt")
                Using writer As New StreamWriter(stream)
                    writer.WriteLine("I can write to local disk.")
                End Using
                End Using
            Else
                ' Persist application-scope property to 
                ' isolated storage
                Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
                Using stream As New IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage)
                Using writer As New StreamWriter(stream)
                    writer.WriteLine("I can write to Isolated Storage")
                End Using
                End Using
            End If
        End Sub

        ' Detect whether or not this application has the requested permission
        Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean
            Try
                ' Try and get this permission
                requestedPermission.Demand()
                Return True
            Catch
                Return False
            End Try
        End Function



...


    End Class
End Namespace
using System.IO; // File, FileStream, StreamWriter
using System.IO.IsolatedStorage; // IsolatedStorageFile
using System.Security; // CodeAccesPermission
using System.Security.Permissions; // FileIOPermission, FileIOPermissionAccess
using System.Windows; // MessageBox

namespace SDKSample
{
    public class FileHandlingGraceful
    {
        public void Save()
        {
            if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt")))
            {
                // Write to local disk
                using (FileStream stream = File.Create(@"c:\newfile.txt"))
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    writer.WriteLine("I can write to local disk.");
                }
            }
            else
            {
                // Persist application-scope property to 
                // isolated storage
                IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
                using (IsolatedStorageFileStream stream = 
                    new IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage))
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    writer.WriteLine("I can write to Isolated Storage");
                }
            }
        }

        // Detect whether or not this application has the requested permission
        bool IsPermissionGranted(CodeAccessPermission requestedPermission)
        {
            try
            {
                // Try and get this permission
                requestedPermission.Demand();
                return true;
            }
            catch
            {
                return false;
            }
        }



...


    }
}

In molte situazioni è possibile trovare un'alternativa all'attendibilità parziale.

In un ambiente controllato, ad esempio una Intranet, è possibile installare framework gestiti personalizzati nella base client in global assembly cache (GAC). Queste librerie possono eseguire codice che richiede attendibilità totale e possono essere oggetto di riferimento da parte di applicazioni alle quali è consentita unicamente l'attendibilità parziale tramite AllowPartiallyTrustedCallersAttribute. Per ulteriori informazioni, vedere Sicurezza (WPF) e Strategia di sicurezza di WPF - Sicurezza della piattaforma.

Rilevamento host del browser

L'utilizzo di CAS per la verifica delle autorizzazioni è una tecnica appropriata se è necessaria una verifica per singola autorizzazione. Tuttavia, tale tecnica dipende dal rilevamento di eccezioni durante la normale elaborazione, operazione che in genere non è consigliata e che può causare problemi di prestazioni. Al contrario, se l'XAML browser application (XBAP) viene eseguita solo nella sandbox dell'area Internet, è possibile utilizzare la proprietà BrowserInteropHelper.IsBrowserHosted, che restituisce true per le XAML browser applications (XBAPs).

NotaNota

La proprietà IsBrowserHosted consente unicamente di stabilire se un'applicazione è eseguita in un browser, non il set di autorizzazioni utilizzato dall'applicazione.

Gestione delle autorizzazioni

Per impostazione predefinita, le applicazioni XBAPs vengono eseguite con attendibilità parziale (set di autorizzazioni dell'area Internet predefinito). Tuttavia, a seconda dei requisiti dell'applicazione, questo set predefinito può essere modificato. Se, ad esempio, un'applicazione XBAPs viene avviata da una Intranet locale, può usufruire di un set di autorizzazioni più esteso, illustrato nella tabella seguente.

Tabella 3: Autorizzazioni LocalIntranet e Internet

Autorizzazione

Attributo

LocalIntranet

Internet

DNS

Accesso ai server DNS

No

Variabili di ambiente

Lettura

No

Finestre di dialogo file

Aprire

Finestre di dialogo file

Illimitato

No

Archiviazione isolata

Isolamento assembly in base all'utente

No

Archiviazione isolata

Isolamento sconosciuto

Archiviazione isolata

Quota utenti illimitata

No

Supporti multimediali

Audio, video e immagini sicure

Stampa

Stampa predefinita

No

Stampa

Stampa sicura

Reflection

Emissione

No

Sicurezza

Esecuzione del codice gestito

Sicurezza

Asserzione autorizzazioni concesse

No

Interfaccia utente

Illimitato

No

Interfaccia utente

Finestre di primo livello sicure

Interfaccia utente

Appunti personali

Browser

Esplorazione sicura dei frame in HTML

Sì

Sì

NotaNota

L'operazione di taglia e incolla, se avviata dall'utente, è consentita solo con l'attendibilità parziale.

Per aumentare il numero di autorizzazioni, è necessario modificare le impostazioni del progetto e il manifesto dell'applicazione ClickOnce. Per ulteriori informazioni, vedere Panoramica delle applicazioni browser XAML di WPF. Anche i seguenti documenti possono rivelarsi utili.

Se l'applicazione XBAP in uso richiede l'attendibilità totale, è possibile utilizzare gli stessi strumenti per aumentare le autorizzazioni necessarie. Tuttavia l'attendibilità totale verrà ottenuta solo se un'applicazione XBAP viene installata o avviata dal computer locale, dalla Intranet o da un URL incluso nell'elenco dei siti attendibili o consentiti del browser. Se l'applicazione viene installata dalla Intranet o da un sito attendibile, verrà visualizzato all'utente il prompt standard di ClickOnce con la notifica relativa alle autorizzazioni elevate. L'utente potrà scegliere se continuare o annullare l'installazione.

In alternativa, è possibile utilizzare il modello di distribuzione attendibile di ClickOnce per una distribuzione con attendibilità totale da qualsiasi area di sicurezza. Per ulteriori informazioni, vedere Cenni preliminari sulla distribuzione di applicazioni attendibili e Sicurezza (WPF).

Vedere anche

Concetti

Sicurezza (WPF)

Strategia di sicurezza di WPF - Sicurezza della piattaforma

Strategia di sicurezza WPF - Progettazione di sicurezza