Sécurité de confiance partielle de WPF
En règle générale, les applications Internet doivent disposer d'un accès direct limité aux ressources système critiques pour éviter des dégâts dus à des actes de malveillance. Par défaut, le langage HTML et le langage de script côté client ne peuvent pas accéder à des ressources système critiques. Comme les applications hébergées par le navigateur de Windows Presentation Foundation (WPF) peuvent être lancées à partir du navigateur, elles doivent se conformer à un jeu de restrictions similaires. Pour appliquer ces restrictions, WPF s'appuie sur la Code Access Security (CAS) et sur ClickOnce (voir Stratégie de sécurité de WPF - ingénierie de la plateforme). Par défaut, les applications hébergées par le navigateur requièrent le jeu d'autorisations CAS de la zone Internet, qu'elles aient été lancées à partir d'Internet, de l'intranet local ou de l'ordinateur local. Les applications qui sont exécutées sans jeu d'autorisations complet sont exécutées avec une confiance dite partielle.
WPF assure de nombreuses prises en charge pour que le plus grand nombre possible de fonctionnalités puissent être utilisées en toute sécurité avec une confiance partielle et prend également en charge la programmation de la confiance partielle avec la CAS.
Cette rubrique contient les sections suivantes :
Prise en charge de la confiance partielle avec des fonctionnalités WPF
Programmation de la confiance partielle
Gestion des autorisations
Prise en charge de la confiance partielle avec des fonctionnalités WPF
Le tableau suivant présente les fonctionnalités de base de Windows Presentation Foundation (WPF) qui peuvent être utilisées en toute sécurité dans le cadre du jeu d'autorisations de la zone Internet.
Tableau 1 : Fonctionnalités WPF pouvant être utilisées en toute sécurité avec une confiance partielle
Domaine de fonctionnalités |
Fonctionnalité |
---|---|
Général |
Fenêtre du navigateur Accès au site d'origine IsolatedStorage (limité à 512 Ko) Fournisseurs UIAutomation Commandes Éditeurs de méthode d'entrée (IME, Input Method Editor) Stylet et encre Glisser-déplacer simulé à l'aide d'événements de capture de la souris et de déplacement OpenFileDialog Désérialisation XAML (via XamlReader.Load) |
Intégration Web |
Boîte de dialogue de téléchargement dans un navigateur Navigation de niveau supérieur initiée par l'utilisateur mailto:links Paramètres de l'URI (Uniform Resource Identifier) HTTPWebRequest Contenu WPF hébergé dans un IFRAME Hébergement de pages HTML sur le même site à l'aide d'un Frame Hébergement de pages HTML sur le même site à l'aide d'un WebBrowser Services Web (ASMX) Services Web (utilisant Windows Communication Foundation) Scripts Document Object Model |
Objets visuels |
2D et 3D Animation Média (site d'origine et interdomaines) Images/Audio/Vidéo |
Lecture |
FlowDocuments Documents XPS Polices système et incorporées Polices CFF et TrueType |
Modification |
Vérification de l'orthographe RichTextBox Prise en charge du Presse-papiers pour l'encre et le texte brut Coller initié par l'utilisateur Copie du contenu sélectionné |
Contrôles |
Contrôle généraux |
Ce tableau présente les fonctionnalités de base de WPF. Pour plus d'informations, le Windows Software Development Kit (SDK) documente les autorisations qui sont requises par chaque membre dans WPF. En outre, les fonctionnalités suivantes proposent des informations plus détaillées sur l'exécution en mode confiance partielle, y compris des considérations spéciales.
XAML (voir Vue d'ensemble du langage XAML (WPF)).
Menus contextuels (voir System.Windows.Controls.Primitives.Popup).
Glisser-déplacer (voir Vue d'ensemble du glisser-déplacer).
Presse-papiers (voir System.Windows.Clipboard).
Images (voir System.Windows.Controls.Image).
Sérialisation (voir XamlReader.Load, XamlWriter.Save).
Boîte de dialogue Ouvrir un fichier (voir Microsoft.Win32.OpenFileDialog).
Les fonctionnalités WPF ne pouvant pas être exécutées en toute sécurité dans le cadre du jeu d'autorisations de la zone Internet sont présentées dans le tableau suivant.
Tableau 2 : Fonctionnalités WPF ne pouvant pas être exécutées en toute sécurité avec une confiance partielle
Domaine de fonctionnalités |
Fonctionnalité |
---|---|
Général |
Fenêtre (boîtes de dialogue et fenêtres définies par l'application) SaveFileDialog Système de fichiers Accès au Registre Glisser-déplacer Sérialisation XAML (via XamlWriter.Save) Clients UIAutomation Accès à la fenêtre source (HwndHost) Prise en charge vocale intégrale Interopérabilité Windows Forms |
Objets visuels |
Effets bitmap Encodage d'images |
Modification |
Presse-papiers Rich Text Format Prise en charge XAML intégrale |
Programmation de la confiance partielle
Pour les applications XBAP, le code qui dépasse le jeu d'autorisations par défaut aura un comportement différent selon la zone de sécurité. Dans certains cas, l'utilisateur recevra un avertissement lorsqu'il essaie de l'installer. L'utilisateur peut choisir de continuer ou d'annuler l'installation. Le tableau suivant décrit le comportement de l'application pour chaque zone de sécurité et ce que vous devez faire pour que l'application reçoive la confiance totale.
Zone de sécurité |
Comportement |
Obtention de la confiance totale |
---|---|---|
Ordinateur local |
Confiance totale automatique |
Aucune action n'est requise. |
Intranet et sites approuvés |
Invite pour la confiance totale |
Signez le XBAP avec un certificat afin que l'utilisateur consulte la source dans l'invite. |
Internet |
Échecs avec « Confiance non accordée » |
Signez l'application XBAP avec un certificat. |
Remarque |
---|
Le comportement décrit dans le tableau précédent concerne les applications XBAP de confiance totale qui ne suivent pas le modèle de déploiement approuvé ClickOnce. |
En général, le code qui outrepasse les permissions autorisées est souvent du code courant qui est partagé entre les applications hébergées par le navigateur et les applications autonomes. CAS et WPF offrent plusieurs techniques pour la gestion de ce scénario.
Détermination des autorisations à l'aide de la sécurité d'accès du code
Dans certains cas, le code partagé qui figure dans des assemblys de bibliothèque peut être utilisé par des applications autonomes et des applications XBAPs. Le code risque alors d'exécuter des fonctionnalités qui pourraient requérir d'autres autorisations que celles accordées par le jeu d'autorisations de l'application. Votre application peut déterminer si une autorisation donnée lui est accordée à l'aide de la sécurité Microsoft .NET Framework. Elle peut plus particulièrement tester si une autorisation donnée lui est accordée en appelant la méthode Demand sur l'instance de l'autorisation en question. Cette vérification est illustrée dans l'exemple ci-dessous, où le code vérifie s'il peut enregistrer un fichier sur le disque local :
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;
}
}
...
}
}
Lorsqu'une application ne dispose pas de l'autorisation souhaitée, l'appel à Demand lève une exception de sécurité. Sinon, l'autorisation a été accordée. IsPermissionGranted encapsule ce comportement et retourne true ou false.
Dégradation progressive des fonctionnalités
Pour du code qui peut être exécuté à partir de différentes zones, il est intéressant de pouvoir déterminer si une autorisation de faire ce qu'il a besoin de faire lui est accordée ou non. Même si la détermination de la zone est un élément, il est de loin préférable de proposer si possible une alternative à l'utilisateur. Par exemple, une application de confiance totale permet généralement aux utilisateurs de créer des fichiers où bon leur semble, alors qu'une application de confiance partielle ne leur permet de créer des fichiers que dans le stockage isolé. Si le code permettant de créer un fichier figure dans un assembly qui est partagé par une application de confiance totale (autonome) et une application de confiance partielle (hébergée par le navigateur), et que les utilisateurs doivent pouvoir créer des fichiers dans les deux applications, le code partagé doit déterminer s'il est exécuté avec une confiance partielle ou totale avant de créer un fichier à l'emplacement indiqué. Le code suivant illustre ces deux cas de figure.
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;
}
}
...
}
}
Dans de nombreux cas, vous devez pouvoir trouver une alternative à la confiance partielle.
Dans un environnement contrôlé, tel qu'un intranet, vous pouvez installer des infrastructures managées personnalisées sur la base cliente dans le global assembly cache (GAC). Ces bibliothèques peuvent exécuter du code qui requiert une confiance totale et être référencées à partir d'applications de confiance partielle uniquement à l'aide de AllowPartiallyTrustedCallersAttribute (pour plus d'informations, consultez Sécurité (WPF) et Stratégie de sécurité de WPF - ingénierie de la plateforme).
Détermination de l'hôte de navigateur
L'utilisation de la CAS pour vérifier si des autorisations sont accordées est une technique indiquée lorsque vous devez effectuer des vérifications autorisation par autorisation. Cette technique dépend toutefois de l'interception d'exceptions dans le cadre d'un traitement normal, ce qui n'est généralement pas recommandé et peut entraîner des problèmes de performances. Si votre XAML browser application (XBAP) est uniquement exécutée dans le bac à sable (sandbox) de la zone Internet, vous pouvez utiliser la propriété BrowserInteropHelper.IsBrowserHosted, qui retourne la valeur true pour les XAML browser applications (XBAPs).
Remarque |
---|
La propriété IsBrowserHosted peut uniquement déterminer si une application est exécutée dans un navigateur. Elle ne permet pas d'identifier le jeu d'autorisations avec lequel une application est exécutée. |
Gestion des autorisations
Par défaut, les applications XBAPs sont exécutées avec une confiance partielle (jeu d'autorisations de la zone Internet par défaut). En fonction des besoins de l'application, il est toutefois possible de changer le jeu d'autorisations par défaut. Par exemple, si une application XBAPs est lancée à partir d'un intranet local, elle peut alors bénéficier d'un jeu d'autorisations plus complet qui est indiqué dans le tableau ci-dessous.
Tableau 3 : Autorisations LocalIntranet et Internet
Autorisation |
Attribut |
LocalIntranet |
Internet |
---|---|---|---|
DNS |
Serveurs d'accès DNS |
Oui |
Non |
Variables d'environnement |
Lecture |
Oui |
Non |
Boîtes de dialogue Fichier |
Ouvrez . |
Oui |
Oui |
Boîtes de dialogue Fichier |
Non restreint |
Oui |
Non |
Stockage isolé |
Isolement de l'assembly par utilisateur |
Oui |
Non |
Stockage isolé |
Isolement inconnu |
Oui |
Oui |
Stockage isolé |
Quota utilisateur illimité |
Oui |
Non |
Multimédia |
Audio, vidéo et images sécurisés |
Oui |
Oui |
Impression |
Impression par défaut |
Oui |
Non |
Impression |
Impression sécurisée |
Oui |
Oui |
Réflexion |
Émission |
Oui |
Non |
Sécurité |
Exécution du code managé |
Oui |
Oui |
Sécurité |
Assertion des autorisations accordées |
Oui |
Non |
Interface utilisateur |
Non restreint |
Oui |
Non |
Interface utilisateur |
Fenêtres de niveau supérieur sécurisées |
Oui |
Oui |
Interface utilisateur |
Propre Presse-papiers |
Oui |
Oui |
Navigateur Web |
Navigation de frame sécurisée vers HTML |
Oui |
Oui |
Remarque |
---|
Le couper-coller est autorisé uniquement en mode confiance partielle lorsqu'il est lancé par l'utilisateur. |
Si vous devez augmenter le niveau d'autorisation, vous devez modifier les paramètres du projet et le manifeste de l'application ClickOnce. Pour plus d'informations, consultez Vue d'ensemble des applications de navigateur XAML. Les documents suivants peuvent également être utiles.
Si votre application XBAP requiert une confiance totale, vous pouvez utiliser les mêmes outils pour élever les autorisations demandées. Toutefois, une application XBAP ne recevra une confiance totale que si elle est installée et lancée à partir de l'ordinateur local, de l'intranet ou d'une URL répertoriée dans les sites fiables ou autorisés du navigateur. Si l'application est installée à partir de l'intranet ou d'un site fiable, l'utilisateur recevra l'invite ClickOnce standard lui signalant les autorisations élevées. L'utilisateur peut choisir de continuer ou d'annuler l'installation.
Vous pouvez également utiliser le modèle de déploiement approuvé ClickOnce pour le déploiement en mode confiance totale à partir de toute zone de sécurité. Pour plus d'informations, consultez Vue d'ensemble du déploiement d'applications approuvées et Sécurité (WPF).