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.
XAML (voir XAML dans WPF).
Fenêtres contextuelles (voir System.Windows.Controls.Primitives.Popup).
Glisser-déplacer (voir Vue d’ensemble du glisser-déplacer).
Presse-papiers (voir System.Windows.Clipboard).
Imagerie (voir System.Windows.Controls.Image).
Sérialisation (voir XamlReader.Load, XamlWriter.Save).
Boîte de dialogue 'Ouvrir le fichier' (voir Microsoft.Win32.OpenFileDialog).
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
- sécurité
- stratégie de sécurité WPF - de sécurité de plateforme
- Stratégie de sécurité WPF - Ingénierie de la sécurité
.NET Desktop feedback