Partager via


Sécurité de confiance partielle WPF

En général, les applications Internet doivent être limitées à avoir un accès direct aux ressources système critiques, afin d’éviter les dommages malveillants. Par défaut, les langages de script HTML et côté client ne sont pas en mesure d’accéder aux ressources système critiques. Étant donné que les applications hébergées par le navigateur Windows Presentation Foundation (WPF) peuvent être lancées à partir du navigateur, elles doivent être conformes à un ensemble similaire de restrictions. Pour appliquer ces restrictions, WPF s’appuie sur la sécurité de l’accès au code (CAS) et sur ClickOnce (voir stratégie de sécurité WPF - Platform Security). Par défaut, les applications hébergées par navigateur demandent l’ensemble d’autorisations d’administration centrale de zone Internet, qu’elles soient lancées à partir d’Internet, de l’intranet local ou de l’ordinateur local. Les applications qui s’exécutent avec n’importe quoi de moins que l’ensemble complet d’autorisations sont considérées comme s’exécutant avec une confiance partielle.

WPF offre un large éventail de prises en charge pour s'assurer que le plus grand nombre possible de fonctionnalités peuvent être utilisées en toute sécurité en confiance limitée et, avec CAS, fournit un soutien supplémentaire pour la programmation en environnement de confiance limitée.

Cette rubrique contient les sections suivantes :

Prise en charge de la confiance partielle pour WPF

Le tableau suivant répertorie les fonctionnalités générales de Windows Presentation Foundation (WPF) qui sont sécurisées à utiliser dans les limites du jeu d’autorisations de zone Internet.

Tableau 1 : Fonctionnalités WPF sécurisées dans l’approbation partielle

Zone des fonctionnalités Caractéristique
Généralités Fenêtre du navigateur

Accès au site d’origine

IsolatedStorage (limite de 512 Ko)

Fournisseurs UIAutomation

Commandant

Éditeurs de méthode d’entrée (IMEs)

Stylet de tablette et encre

Glisser-déposer simulé à l’aide de la capture de la souris et des événements de déplacement

OpenFileDialog

Désérialisation de XAML (via XamlReader.Load)
Intégration web Boîte de dialogue de téléchargement du navigateur

Navigation Top-Level User-Initiated

mailto:links

Paramètres d’identificateur de ressource uniforme

HTTPWebRequest

Contenu WPF hébergé dans un IFRAME

Hébergement de pages HTML Same-Site à l’aide de Frame

Hébergement de pages HTML de même site à l’aide de WebBrowser

Services Web (ASMX)

Services web (à l’aide de Windows Communication Foundation)

Écriture de scripts

Modèle objet de document
Visuels 2D et 3D

Animation

Média (site d’origine et inter-domaines)

Imagerie/audio/vidéo
Lecture FlowDocuments

XPS Documents

Polices système incorporées &

Polices CFF & TrueType
Édition Vérification orthographique

RichTextBox

Prise en charge du Presse-papiers en texte clair et du Presse-papiers manuscrit

User-Initiated Coller

Copie du contenu sélectionné
Contrôles Contrôles généraux

Ce tableau couvre les fonctionnalités WPF à un niveau élevé. Pour plus d’informations, le Kit de développement logiciel (SDK) Windows documente les autorisations requises par chaque membre dans WPF. En outre, les fonctionnalités suivantes ont des informations plus détaillées sur l'exécution de confiance partielle, y compris des considérations spéciales.

Le tableau suivant présente les fonctionnalités WPF qui ne sont pas sécurisées pour s’exécuter dans les limites du jeu d’autorisations de zone Internet.

Tableau 2 : Fonctionnalités WPF qui ne sont pas sécurisées dans la confiance partielle

Zone des fonctionnalités Caractéristique
Généralités Fenêtre (Fenêtres définies par l’application et boîtes de dialogue)

SaveFileDialog

Système de fichiers

Accès au Registre

Glisser-déplacer

Sérialisation XAML (par XamlWriter.Save)

UIAutomation Clients

Accès à la fenêtre source (HwndHost)

Support vocal complet

Interopérabilité Windows Forms
Visuels Effets de bitmap

Encodage d’image
Édition Presse-papiers RTF

Prise en charge complète du code XAML

Programmation de confiance partielle

Pour les applications XBAP, le code qui dépasse le jeu d’autorisations par défaut aura un comportement différent en fonction de la zone de sécurité. Dans certains cas, l’utilisateur reçoit un avertissement lorsqu’il tente 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 une confiance totale.

Avertissement

Les XBAPs requièrent l'utilisation de navigateurs anciens pour fonctionner, tels qu'Internet Explorer et les anciennes versions de Firefox. Ces navigateurs plus anciens ne sont généralement pas pris en charge sur Windows 10 et Windows 11. Les navigateurs modernes ne prennent plus en charge la technologie requise pour les applications XBAP en raison des risques de sécurité. Les plug-ins qui activent les XBAPs ne sont plus pris en charge. Pour plus d’informations, consultez Foire aux questions sur les applications WPF hébergées par navigateur (XBAP).

Zone de sécurité Comportement Obtention d’une confiance totale
Ordinateur local Confiance totale automatique Aucune action n’est nécessaire.
Sites intranet et approuvés Demande de pleine confiance Signez le XBAP avec un certificat afin que l’utilisateur voit la source dans l’invite.
Internet Échec avec « Confiance non accordée » Signez le XBAP avec un certificat.

Note

Le comportement décrit dans le tableau précédent est destiné aux XBAP de confiance totale qui ne suivent pas le modèle de déploiement approuvé ClickOnce.

En général, le code qui peut dépasser les autorisations autorisées est susceptible d’être du code commun partagé entre les applications autonomes et hébergées par le navigateur. CAS et WPF offrent plusieurs techniques de gestion de ce scénario.

Détection des autorisations à l’aide du système d’administration centrale

Dans certains cas, il est possible que le code partagé dans les assemblys de bibliothèque soit utilisé par les applications autonomes et les XBAPs. Dans ce cas, le code peut exécuter des fonctionnalités qui peuvent nécessiter plus d’autorisations que le jeu d’autorisations accordé par l’application. Votre application peut détecter si elle dispose ou non d’une certaine autorisation à l’aide de la sécurité de Microsoft .NET Framework. Plus précisément, il peut tester s’il dispose d’une autorisation spécifique en appelant la méthode Demand sur l’instance de l’autorisation souhaitée. Ceci est illustré dans l’exemple suivant, qui contient du code qui demande s’il a la possibilité d’enregistrer un fichier sur le disque local :

using System.IO;
using System.IO.IsolatedStorage;
using System.Security;
using System.Security.Permissions;
using System.Windows;

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;
            }
        }


Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Security
Imports System.Security.Permissions
Imports System.Windows

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

Si une application n’a pas l’autorisation souhaitée, l’appel à Demand lève une exception de sécurité. Dans le cas contraire, l’autorisation a été accordée. IsPermissionGranted encapsule ce comportement et retourne true ou false le cas échéant.

Dégradation progressive des fonctionnalités

Être en mesure de détecter si le code a l’autorisation de faire ce qu’il doit faire est intéressant pour le code qui peut être exécuté à partir de différentes zones. Bien que la détection de la zone soit une chose, il est bien préférable de fournir une alternative pour l’utilisateur, si possible. Par exemple, une application de confiance totale permet généralement aux utilisateurs de créer des fichiers où qu’ils souhaitent, tandis qu’une application d’approbation partielle ne peut créer que des fichiers dans un stockage isolé. Si le code permettant de créer un fichier existe dans un assembly partagé par des applications de confiance totale (autonome) et des applications d’approbation partielle (hébergée par le navigateur), et que les deux applications veulent que les utilisateurs puissent créer des fichiers, le code partagé doit détecter s’il s’exécute en confiance partielle ou totale avant de créer un fichier à l’emplacement approprié. Le code suivant illustre les deux.

using System.IO;
using System.IO.IsolatedStorage;
using System.Security;
using System.Security.Permissions;
using System.Windows;

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;
            }
        }


Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Security
Imports System.Security.Permissions
Imports System.Windows

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

Dans de nombreux cas, vous devriez être en mesure de trouver une alternative de confiance partielle.

Dans un environnement contrôlé, tel qu’un intranet, des frameworks managés personnalisés peuvent être installés sur la base cliente dans le Global Assembly Cache (GAC). Ces bibliothèques peuvent exécuter du code nécessitant une confiance totale et être référencées à partir d’applications qui ne sont autorisées qu’une approbation partielle à l’aide de AllowPartiallyTrustedCallersAttribute (pour plus d’informations, consultez de sécurité et stratégie de sécurité WPF - Sécurité de la plateforme).

Détection de l’hôte du navigateur

L’utilisation du système d’administration centrale pour vérifier les autorisations est une technique appropriée lorsque vous devez vérifier par autorisation. Bien que cette technique dépende de l'interception d'exceptions dans le cadre d'un traitement normal, ce qui n'est pas recommandé en général et peut entraîner des problèmes de performance. Au lieu de cela, si votre application de navigateur XAML (XBAP) s'exécute uniquement dans le bac à sable de la zone Internet, vous pouvez utiliser la propriété BrowserInteropHelper.IsBrowserHosted, qui retourne vrai pour les applications de navigateur XAML (XBAPs).

Avertissement

Les XBAPs nécessitent d'utiliser des navigateurs anciens, tels qu'Internet Explorer et les anciennes versions de Firefox. Ces navigateurs plus anciens ne sont généralement pas pris en charge sur Windows 10 et Windows 11. Les navigateurs modernes ne prennent plus en charge la technologie requise pour les applications XBAP en raison des risques de sécurité. Les plug-ins qui activent les XBAPs ne sont plus pris en charge. Pour plus d’informations, consultez Foire aux questions sur les applications hébergées par un navigateur WPF (XBAP).

Note

IsBrowserHosted distingue uniquement si une application est en cours d’exécution dans un navigateur, et non pas avec quel ensemble d’autorisations une application s’exécute.

Gestion des autorisations

Par défaut, les XBAPs s’exécutent avec une confiance partielle (paramètres de la zone Internet par défaut). Toutefois, en fonction des exigences de l’application, il est possible de modifier l’ensemble d’autorisations par défaut. Par exemple, si un XBAPs est lancé à partir d’un intranet local, il peut tirer parti d’un jeu d’autorisations accru, illustré dans le tableau suivant.

Avertissement

Les XBAPs nécessitent des navigateurs hérités pour fonctionner, tels qu’Internet Explorer et les anciennes versions de Firefox. Ces navigateurs plus anciens ne sont généralement pas pris en charge sur Windows 10 et Windows 11. Les navigateurs modernes ne prennent plus en charge la technologie requise pour les applications XBAP en raison des risques de sécurité. Les plug-ins qui activent les XBAPs ne sont plus pris en charge. Pour plus d’informations, consultez FAQ sur les applications hébergées par un navigateur WPF (XBAP).

Tableau 3 : Autorisations LocalIntranet et Internet

Autorisation Attribut LocalIntranet Internet
DNS (Système de noms de domaine) Accéder aux serveurs DNS Oui Non
Variables d’environnement Lire Oui Non
Boîtes de dialogue de fichier Ouvrir Oui Oui
Boîtes de dialogue de fichiers Illimité Oui Non
Stockage isolé Isolation de l’assembly par l’utilisateur Oui Non
Stockage isolé Isolation inconnue Oui Oui
Stockage isolé Quota d’utilisateurs illimité Oui Non
Mé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 Émettre Oui Non
Sécurité Exécution de code managé Oui Oui
Sécurité Assertion d’autorisations accordées Oui Non
Interface utilisateur Illimité Oui Non
Interface utilisateur Fenêtres de niveau supérieur sécurisées Oui Oui
Interface utilisateur Presse-papiers personnel Oui Oui
Navigateur Web Navigation avec trame sécurisée au format HTML Oui Oui

Note

Couper et coller n'est autorisé qu'en environnement à confiance partielle lorsque l'utilisateur a initié l'opération.

Si vous devez augmenter les autorisations, 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 WPF. Les documents suivants peuvent également être utiles.

Si votre XBAP nécessite une confiance totale, vous pouvez utiliser les mêmes outils pour augmenter les autorisations demandées. Bien qu’un XBAP reçoive uniquement une confiance totale s’il est installé et lancé à partir de l’ordinateur local, de l’intranet ou d’une URL répertoriée dans les sites approuvés ou autorisés du navigateur. Si l’application est installée à partir de l’intranet ou d’un site approuvé, l’utilisateur reçoit l’invite ClickOnce standard qui les informe des 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 pleine confiance à partir de quelle que soit la zone de sécurité. Pour plus d’informations, consultez Vue d’ensemble du Déploiement d’applications approuvées et Sécurité.

Voir aussi