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.

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.

RemarqueRemarque

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).

RemarqueRemarque

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

RemarqueRemarque

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).

Voir aussi

Concepts

Sécurité (WPF)

Stratégie de sécurité de WPF - ingénierie de la plateforme

Stratégie de sécurité de WPF - ingénierie de sécurité