Freigeben über


Teilweise Vertrauenswürdige Sicherheit in WPF

Im Allgemeinen sollten Internetanwendungen daran gehindert werden, direkten Zugriff auf kritische Systemressourcen zu haben, um böswillige Schäden zu verhindern. Standardmäßig können HTML- und clientseitige Skriptsprachen nicht auf wichtige Systemressourcen zugreifen. Da vom Browser gehostete Windows Presentation Foundation (WPF)-Anwendungen über den Browser gestartet werden können, sollten sie einer ähnlichen Gruppe von Einschränkungen entsprechen. Um diese Einschränkungen zu erzwingen, basiert WPF sowohl auf CodeZugriffssicherheit (Code Access Security, CAS) als auch clickOnce (siehe WPF-Sicherheitsstrategie – Plattformsicherheit). Standardmäßig beanspruchen browsergehostete Anwendungen den CAS-Berechtigungssatz der Internetzone, unabhängig davon, ob sie vom Internet, dem lokalen Intranet oder dem lokalen Computer gestartet werden. Anwendungen, die nicht mit dem vollständigen Satz an Berechtigungen ausgeführt werden, werden mit eingeschränktem Vertrauen ausgeführt.

Warnung

XBAPs erfordern, dass ältere Browser funktionieren, z. B. Internet Explorer und alte Versionen von Firefox. Diese älteren Browser werden in der Regel unter Windows 10 und Windows 11 nicht unterstützt. Moderne Browser unterstützen die für XBAP-Apps erforderliche Technologie aufgrund von Sicherheitsrisiken nicht mehr. Plug-Ins, die XBAPs aktivieren, werden nicht mehr unterstützt. Weitere Informationen finden Sie unter Häufig gestellte Fragen zu WPF-Anwendungen, die im Browser gehostet werden (XBAP).

WPF bietet eine Vielzahl von Unterstützung, um sicherzustellen, dass so viele Funktionen wie möglich sicher in partiellem Vertrauen verwendet werden können, und bietet zusammen mit CAS zusätzliche Unterstützung für die Programmierung mit partiellem Vertrauen.

Dieses Thema enthält die folgenden Abschnitte:

Teilweise vertrauenswürdige WPF-Funktion

Warnung

Code Access Security (CAS) wird von modernem .NET nicht unterstützt, es handelt sich um ein .NET Framework-Only-Konzept. Alle CAS-bezogenen Funktionen gelten als vollständig vertrauenswürdig. Weitere Informationen finden Sie unter Unterschiede mit WPF .NET – Codezugriffssicherheit.

In der folgenden Tabelle sind die allgemeinen Features von Windows Presentation Foundation (WPF) aufgeführt, die innerhalb der Grenzwerte des Internetzonenberechtigungssatzes sicher verwendet werden können.

Tabelle 1: WPF-Eigenschaften, die bei reduziertem Vertrauen sicher sind

Funktionsbereich Merkmal
Allgemein Browserfenster

Ort des Herkunftszugriffs

IsolatedStorage (Grenzwert von 512 KB)

UIAutomation-Anbieter

Befehlend

Eingabemethoden-Editoren (IMEs)

Tabletstift und Tinte

Simuliertes Ziehen/Ablegen mit Mauserfassungs- und Bewegungsereignissen

OpenFileDialog

XAML-Deserialisierung (über XamlReader.Load)
Webintegration Browser-Download-Dialog

Top-Level User-Initiated Navigation

mailto:links

Uniform Resource Identifier-Parameter

HTTPWebRequest

In einem IFRAME gehosteter WPF-Inhalt

Hosten von Same-Site HTML-Seiten mit Frame

Hosten von HTML-Seiten derselben Website mithilfe von WebBrowser

Webdienste (ASMX)

Webdienste (mit Windows Communication Foundation)

Skripterstellung

Dokumentobjektmodell
Visuelle Elemente 2D und 3D

Zeichentrickfilm

Medien (Ursprungseite und Domänenübergreifend)

Imageerstellung/Audio/Video
Lesen FlowDocuments

XPS-Dokumente

Eingebettete & Systemschriftarten

CFF & TrueType-Schriftarten
Bearbeiten Rechtschreibprüfung

RichTextBox

Unterstützung für Klartext und Tinte in der Zwischenablage

User-Initiated Einfügen

Kopieren ausgewählter Inhalte
Bedienelemente Allgemeine Steuerelemente

In dieser Tabelle werden die WPF-Features auf hoher Ebene behandelt. Für ausführlichere Informationen dokumentiert das Windows SDK die Berechtigungen, die für jedes Mitglied in WPF erforderlich sind. Darüber hinaus bieten die folgenden Features detailliertere Informationen zur Ausführung mit eingeschränktem Vertrauen, einschließlich besonderer Berücksichtigungen.

In der folgenden Tabelle sind die WPF-Features aufgeführt, die nicht sicher innerhalb der Grenzwerte des Berechtigungssatzes für die Internetzone ausgeführt werden können.

Tabelle 2: WPF-Features, die in eingeschränkter Vertrauensstellung nicht sicher sind

Funktionsbereich Merkmal
Allgemein Fenster (Anwendungsdefinierte Fenster und Dialogfelder)

Datei speichern Dialog

Dateisystem

Zugriff auf die Registrierung

Ziehen und Loslassen

XAML-Serialisierung (über XamlWriter.Save)

UIAutomation-Clients

Zugriff auf Quellfenster (HwndHost)

Vollständige Sprachunterstützung

Windows Forms-Interoperabilität
Visuelle Elemente Bitmapeffekte

Bildcodierung
Bearbeiten Rich-Text-Format-Zwischenablage

Vollständige XAML-Unterstützung

Partielle Vertrauensprogrammierung

Für XBAP-Anwendungen hat Code, der den Standardberechtigungssatz überschreitet, je nach Sicherheitszone ein anderes Verhalten. In einigen Fällen erhält der Benutzer eine Warnung, wenn er versucht, ihn zu installieren. Der Benutzer kann die Installation fortsetzen oder abbrechen. In der folgenden Tabelle wird das Verhalten der Anwendung für jede Sicherheitszone und die Aktionen beschrieben, die sie für die Anwendung ausführen müssen, um volle Vertrauenswürdigkeit zu erhalten.

Warnung

XBAPs erfordern, dass ältere Browser funktionieren, z. B. Internet Explorer und alte Versionen von Firefox. Diese älteren Browser werden in der Regel unter Windows 10 und Windows 11 nicht unterstützt. Moderne Browser unterstützen die für XBAP-Apps erforderliche Technologie aufgrund von Sicherheitsrisiken nicht mehr. Plug-Ins, die XBAPs aktivieren, werden nicht mehr unterstützt. Weitere Informationen finden Sie unter Häufig gestellte Fragen zu WPF-Anwendungen, die im Browser gehostet werden (XBAP).

Sicherheitszone Verhalten Volles Vertrauen gewinnen
Lokaler Computer Automatisches Volles Vertrauen Es ist keine Aktion erforderlich.
Intranet und vertrauenswürdige Websites Aufforderung zur uneingeschränkten Vertrauenswürdigkeit Signieren Sie die XBAP mit einem Zertifikat, damit der Benutzer die Quelle in der Eingabeaufforderung sieht.
Internet Schlägt mit "Vertrauensstellung nicht gewährt" fehl. Signieren Sie die XBAP mit einem Zertifikat.

Hinweis

Das in der vorherigen Tabelle beschriebene Verhalten gilt für voll vertrauenswürdige XBAPs, die nicht dem ClickOnce Trusted Deployment-Modell folgen.

Im Allgemeinen ist Code, der die zulässigen Berechtigungen überschreitet, wahrscheinlich gängiger Code, der sowohl zwischen eigenständigen als auch von Browser gehosteten Anwendungen gemeinsam genutzt wird. CAS und WPF bieten verschiedene Techniken zum Verwalten dieses Szenarios.

Erkennen von Berechtigungen mithilfe von CAS

In einigen Fällen ist es möglich, dass gemeinsam genutzter Code in Bibliotheksassemblys sowohl von eigenständigen Anwendungen als auch von XBAPs verwendet werden kann. In diesen Fällen kann Code Funktionen ausführen, die mehr Berechtigungen erfordern könnten, als der erteilte Berechtigungssatz der Anwendung zulässt. Ihre Anwendung kann erkennen, ob sie über eine bestimmte Berechtigung verfügt, indem Sie die Sicherheit von Microsoft .NET Framework verwenden. Insbesondere kann getestet werden, ob sie über eine bestimmte Berechtigung verfügt, indem sie die Demand Methode für die Instanz der gewünschten Berechtigung aufruft. Dies wird im folgenden Beispiel gezeigt, das Code enthält, mit dem abgefragt wird, ob eine Datei auf dem lokalen Datenträger gespeichert werden kann:

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

Wenn eine Anwendung nicht über die gewünschte Berechtigung verfügt, löst der Aufruf Demand eine Sicherheits ausnahme aus. Ansonsten wurde die Berechtigung erteilt. IsPermissionGranted kapselt dieses Verhalten und gibt true oder false zurück, wenn angemessen.

Sanfte Degradation der Funktionalität

Wenn Sie erkennen können, ob Code über die Berechtigung verfügt, zu tun, was er tun muss, ist interessant für Code, der aus verschiedenen Zonen ausgeführt werden kann. Die Erkennung der Zone ist zwar eine Sache, aber es ist viel besser, eine Alternative für den Benutzer bereitzustellen, wenn möglich. Beispielsweise ermöglicht eine voll vertrauenswürdige Anwendung benutzern in der Regel das Erstellen von Dateien an beliebiger Stelle, während eine teilweise vertrauenswürdige Anwendung nur Dateien im isolierten Speicher erstellen kann. Wenn der Code zum Erstellen einer Datei in einer Assembly vorhanden ist, die sowohl von voll vertrauenswürdigen (eigenständigen) Anwendungen als auch von teilweise vertrauenswürdigen (browsergehosteten) Anwendungen geteilt wird, und beide Anwendungen möchten, dass Benutzer Dateien erstellen können, sollte der freigegebene Code erkennen, ob sie teilweise oder vollständig vertrauenswürdig ausgeführt wird, bevor Sie eine Datei am entsprechenden Speicherort erstellen. Der folgende Code veranschaulicht beide.

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

In vielen Fällen sollten Sie in der Lage sein, eine teilweise vertrauenswürdige Alternative zu finden.

In einer kontrollierten Umgebung, z. B. einem Intranet, können benutzerdefinierte verwaltete Frameworks über die Clientbasis im globalen Assemblycache (GAC) installiert werden. Diese Bibliotheken können Code ausführen, der vollen Vertrauens bedarf, und in Anwendungen referenziert werden, die nur teilweise vertrauenswürdig sind, indem sie AllowPartiallyTrustedCallersAttribute verwenden (weitere Informationen finden Sie unter Sicherheit und WPF-Sicherheitsstrategie – Plattformsicherheit).

Browserhosterkennung

Die Verwendung von CAS, um Berechtigungen zu prüfen, ist eine geeignete Technik, wenn Sie Berechtigungen einzeln überprüfen müssen. Diese Technik hängt zwar davon ab, Ausnahmen als Teil der normalen Verarbeitung abzufangen, was im Allgemeinen nicht empfohlen wird und Leistungsprobleme haben kann. Stattdessen können Sie die BrowserInteropHelper.IsBrowserHosted-Eigenschaft verwenden, die für XAML-Browseranwendungen (XBAPs), die nur innerhalb des Sandkastens der Internetzone ausgeführt werden, true zurückgibt.

Warnung

XBAPs erfordern, dass ältere Browser funktionieren, z. B. Internet Explorer und alte Versionen von Firefox. Diese älteren Browser werden in der Regel unter Windows 10 und Windows 11 nicht unterstützt. Moderne Browser unterstützen die für XBAP-Apps erforderliche Technologie aufgrund von Sicherheitsrisiken nicht mehr. Plug-Ins, die XBAPs aktivieren, werden nicht mehr unterstützt. Weitere Informationen finden Sie unter Häufig gestellte Fragen zu WPF-Anwendungen, die im Browser gehostet werden (XBAP).

Hinweis

IsBrowserHosted unterscheidet nur, ob eine Anwendung in einem Browser ausgeführt wird und nicht mit welchen Berechtigungen eine Anwendung ausgeführt wird.

Verwalten von Berechtigungen

Standardmäßig werden XBAPs mit teilweiser Vertrauensstellung (Standardberechtigungssatz für Internetzonen) ausgeführt. Je nach den Anforderungen der Anwendung ist es jedoch möglich, den Satz von Berechtigungen von der Standardeinstellung zu ändern. Wenn z. B. ein XBAPs aus einem lokalen Intranet gestartet wird, kann er einen erhöhten Berechtigungssatz nutzen, der in der folgenden Tabelle dargestellt wird.

Warnung

XBAPs erfordern, dass ältere Browser funktionieren, z. B. Internet Explorer und alte Versionen von Firefox. Diese älteren Browser werden in der Regel unter Windows 10 und Windows 11 nicht unterstützt. Moderne Browser unterstützen die für XBAP-Apps erforderliche Technologie aufgrund von Sicherheitsrisiken nicht mehr. Plug-Ins, die XBAPs aktivieren, werden nicht mehr unterstützt. Weitere Informationen finden Sie unter Häufig gestellte Fragen zu WPF-Anwendungen, die im Browser gehostet werden (XBAP).

Tabelle 3: Lokale Intranet- und Internetberechtigungen

Erlaubnis Merkmal LocalIntranet Internet
Domain Name System (DNS) Zugreifen auf DNS-Server Ja Nein
Umgebungsvariablen Lesen Sie Ja Nein
Dateidialoge Öffnen Ja Ja
Dateidialoge Nicht eingeschränkt Ja Nein
Isolierter Speicher Isolation der Assembly pro Benutzer Ja Nein
Isolierter Speicher Unbekannte Isolation Ja Ja
Isolierter Speicher Unbegrenztes Benutzerkontingent Ja Nein
Medien Sicheres Audio, Video und Bilder Ja Ja
Druck Standarddruck Ja Nein
Druck Sicherer Druck Ja Ja
Spiegelung Ausgabe Ja Nein
Sicherheit Verwaltete Codeausführung Ja Ja
Sicherheit Bestätigen erteilter Berechtigungen Ja Nein
Benutzeroberfläche Nicht eingeschränkt Ja Nein
Benutzeroberfläche Sichere Fenster der obersten Ebene Ja Ja
Benutzeroberfläche Eigene Zwischenablage Ja Ja
Webbrowser Sichere Framenavigation zu HTML Ja Ja

Hinweis

"Ausschneiden und Einfügen" ist nur im eingeschränkten Vertrauensmodus erlaubt, wenn es vom Benutzer initiiert wird.

Wenn Sie Berechtigungen erhöhen müssen, müssen Sie die Projekteinstellungen und das ClickOnce-Anwendungsmanifest ändern. Weitere Informationen finden Sie in der Übersicht über WPF-XAML-Browseranwendungen. Die folgenden Dokumente können auch hilfreich sein.

Wenn Ihr XBAP voll vertrauenswürdig ist, können Sie dieselben Tools verwenden, um die angeforderten Berechtigungen zu erhöhen. Obwohl ein XBAP nur voll vertrauenswürdig wird, wenn es auf dem lokalen Computer, dem Intranet oder von einer URL installiert und gestartet wird, die in den vertrauenswürdigen oder zulässigen Websites des Browsers aufgeführt ist. Wenn die Anwendung über das Intranet oder eine vertrauenswürdige Website installiert ist, erhält der Benutzer die standardmäßige ClickOnce-Eingabeaufforderung, die sie über die erhöhten Berechtigungen benachrichtigt. Der Benutzer kann die Installation fortsetzen oder abbrechen.

Alternativ können Sie das ClickOnce Trusted Deployment-Modell für die voll vertrauenswürdige Bereitstellung aus einer beliebigen Sicherheitszone verwenden. Weitere Informationen finden Sie unter "Übersicht über die Bereitstellung vertrauenswürdiger Anwendungen" und "Sicherheit".

Siehe auch