Partager via


Sécurité de confiance partielle WPF

En général, les applications Internet doivent être limitées à l’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é d’accès au code (CAS) et sur ClickOnce (voir Stratégie de sécurité WPF - Sécurité de la plateforme). 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.

Avertissement

Les XBAPs nécessitent des 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 Questions fréquemment posées sur les applications WPF hébergées dans un navigateur (XBAP).

WPF fournit un large éventail de prise en charge pour s’assurer que la plupart des fonctionnalités possibles peuvent être utilisées en toute sécurité dans la confiance partielle, et avec le cas, fournit une prise en charge supplémentaire pour la programmation de confiance partielle.

Cette rubrique contient les sections suivantes :

Prise en charge de l’approbation partielle des fonctionnalités WPF

Avertissement

La sécurité d’accès au code (CAS) n’est pas prise en charge par .NET moderne, il s’agit d’un concept .NET Framework uniquement. Toutes les fonctionnalités liées à CAS sont traitées selon le présupposé de pleine confiance. Pour plus d’informations, consultez Différences avec WPF .NET - Sécurité de l’accès au code.

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

Commandement

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

Stylet de tablette et encre

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

OpenFileDialog

Désérialisation XAML (via XamlReader.Load)
Intégration web Boîte de dialogue 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 incorporées et polices système

Polices CFF & TrueType
Modification Vérification orthographique

RichTextBox

Prise en charge du presse-papiers pour le texte clair et le 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 avec confiance partielle, notamment 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)

Boîte de dialogue Enregistrer le fichier

Système de fichiers

Accès au Registre

Glisser-déplacer

Sérialisation XAML (via XamlWriter.Save)

UIAutomation Clients

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

Prise en charge vocale complète

Interopérabilité Windows Forms
Visuels Effets bitmap

Encodage d’image
Modification Presse-papiers au format texte enrichi

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 nécessitent des 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 Questions fréquemment posées sur les applications WPF hébergées dans un 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 sites de confiance Invitation à accorder une confiance totale 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.

Remarque

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 Demand méthode 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 levera une exception de sécurité. Sinon, l’autorisation a été accordée. IsPermissionGranted encapsule ce comportement et retourne true ou false le cas échéant.

Dégradation appropriée 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 auxquelles seule une confiance partielle est accordée via AllowPartiallyTrustedCallersAttribute (pour plus d’informations, consultez 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 performances. Au lieu de cela, si votre application de navigateur XAML (XBAP) s'exécute uniquement dans le sandbox de la zone Internet, vous pouvez utiliser BrowserInteropHelper.IsBrowserHosted propriété, qui retourne vrai pour les applications de navigateur XAML (XBAPs).

Avertissement

Les XBAPs nécessitent des 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 Questions fréquemment posées sur les applications WPF hébergées dans un navigateur (XBAP).

Remarque

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 est en cours d’exécution.

Gestion des autorisations

Par défaut, les XBAPs s'exécutent avec une confiance partielle (jeu d'autorisations 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 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 Questions fréquemment posées sur les applications WPF hébergées dans un navigateur (XBAP).

Tableau 3 : Autorisations LocalIntranet et Internet

Autorisation Caractéristique LocalIntranet Internet
Système de noms de domaine (DNS) Accéder aux serveurs DNS Oui Non
Variables d’environnement Lire Oui Non
Boîtes de dialogue de fichiers Ouvrir Oui Oui
Boîtes de dialogue de fichiers Non restreint 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 Non restreint 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

Remarque

Couper et coller n’est autorisé qu’en confiance limitée lorsqu'initié par l'utilisateur.

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 un déploiement en pleine confiance à partir de n’importe quelle zone de sécurité. Pour plus d’informations, consultez Vue d’ensemble et sécurité du déploiement d’applications approuvées.

Voir aussi