Compartilhar via


Segurança de confiança parcial do WPF

Em geral, os aplicativos da Internet devem ser impedidos de ter acesso direto a recursos críticos do sistema, para evitar danos mal-intencionados. Por padrão, as linguagens de script HTML e do lado do cliente não são capazes de acessar recursos críticos do sistema. Como os aplicativos hospedados pelo navegador WPF (Windows Presentation Foundation) podem ser iniciados a partir do navegador, eles devem estar em conformidade com um conjunto semelhante de restrições. Para impor essas restrições, o WPF depende do CAS (Code Access Security) e do ClickOnce (consulte Estratégia de Segurança do WPF –de Segurança da Plataforma). Por padrão, os aplicativos hospedados pelo navegador solicitam o conjunto de permissões CAS da zona da Internet, independentemente de serem iniciados da Internet, da intranet local ou do computador local. Aplicativos que são executados com menos do que o conjunto completo de permissões são considerados em execução com confiança parcial.

O WPF fornece uma ampla variedade de suporte para garantir que o máximo de funcionalidade possível possa ser usado com segurança na confiança parcial e, juntamente com o CAS, fornece suporte adicional para programação de confiança parcial.

Este tópico contém as seguintes seções:

Segurança parcialmente confiável do recurso de WPF

A tabela a seguir lista os recursos de alto nível do WPF (Windows Presentation Foundation) que são seguros de usar dentro dos limites do conjunto de permissões de zona da Internet.

Tabela 1: Recursos de WPF que são aceitos em confiança parcial

Área de recursos Característica
Geral Janela do navegador

Acesso ao Site de Origem

IsolatedStorage (limite de 512 KB)

Provedores de UIAutomation

Comando

IMEs (Editores de Método de Entrada)

Caneta e Tinta de Tablet

Simulação de arrastar/soltar usando eventos de movimento e captura do Mouse

OpenFileDialog

Desserialização de XAML (via XamlReader)
Integração da Web Caixa de diálogo de download do navegador

Navegação Top-Level User-Initiated

mailto:links

Parâmetros uniformes do identificador de recurso

HTTPWebRequest

Conteúdo do WPF hospedado em um IFRAME

Hospedagem de páginas HTML de Same-Site usando Frame

Hospedagem de páginas HTML do mesmo site usando WebBrowser

Serviços Web (ASMX)

Serviços Web (usando o Windows Communication Foundation)

Script

Modelo de objeto do documento
Visuais 2D e 3D

Animação

Mídia (Site de origem e entre domínios)

Imagem/áudio/vídeo
Leitura FlowDocuments

Documentos XPS

Fontes internas e do sistema

Fontes CFF e TrueType
Edição Verificação ortográfica

RichTextBox

Texto sem formatação e suporte à área de transferência de tinta

Colar iniciado pelo usuário

Copiando conteúdo selecionado
Controles Controles gerais

Esta tabela aborda os recursos do WPF em um alto nível. Para obter informações mais detalhadas, o SDK do Windows documenta as permissões exigidas por cada membro no WPF. Além disso, os recursos a seguir possuem informações mais detalhadas sobre a execução em confiança parcial, incluindo considerações especiais.

A tabela a seguir descreve os recursos do WPF que não são seguros para execução dentro dos limites do conjunto de permissões da zona da Internet.

Tabela 2: Recursos do WPF que não são seguros na confiança parcial

Área de recursos Característica
Geral Janela (janelas e caixas de diálogo definidas pelo aplicativo)

SaveFileDialog

Sistema de ficheiros

Acesso ao Registro

Arrastar e soltar

Serialização de XAML (via XamlWriter.Save)

Clientes UIAutomation

Acesso à fonte de janela (HwndHost)

Suporte completo ao Serviço Cognitivo do Azure para Fala

Interoperabilidade do Windows Forms
Visuais Efeitos de bitmap

Codificação de imagem
Edição Área de transferência do formato Rich Text

Suporte completo ao XAML

Programação de confiança parcial

Para aplicativos XBAP, o código que exceder o conjunto de permissões padrão terá um comportamento diferente dependendo da zona de segurança. Em alguns casos, o usuário receberá um aviso ao tentar instalá-lo. O usuário pode optar por continuar ou cancelar a instalação. A tabela a seguir descreve o comportamento do aplicativo para cada zona de segurança e o que você precisa fazer para que o aplicativo receba total confiança.

Aviso

Os XBAPs exigem que navegadores herdados operem, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não têm suporte no Windows 10 e no Windows 11. Os navegadores modernos não dão mais suporte à tecnologia necessária para aplicativos XBAP devido a riscos de segurança. Plug-ins que habilitam XBAPs não têm mais suporte. Para obter mais informações, consulte Perguntas frequentes sobre oXBAP (aplicativos hospedados por navegador) do WPF.

Zona de Segurança Comportamento Obtendo total confiança
Computador local Confiança total automática Nenhuma ação é necessária.
Intranet e sites confiáveis Aviso para confiança total Assine o XBAP com um certificado para que o usuário veja a origem no prompt.
Internet Falha com "Confiança não concedida" Assinar o XBAP com um certificado.

Nota

O comportamento descrito na tabela anterior é para XBAPs de confiança total que não seguem o modelo de Implantação Confiável ClickOnce.

Em geral, o código que pode exceder as permissões permitidas provavelmente será um código comum compartilhado entre aplicativos autônomos e hospedados pelo navegador. CAS e WPF oferecem várias técnicas para gerenciar esse cenário.

Detectando permissões usando o CAS

Em algumas situações, é possível que o código compartilhado em assemblies de biblioteca seja usado por aplicativos autônomos e XBAPs. Nesses casos, o código pode executar uma funcionalidade que pode exigir mais permissões do que o conjunto de permissões concedido pelo aplicativo permite. Seu aplicativo pode detectar se ele tem ou não uma determinada permissão usando a segurança do Microsoft .NET Framework. Especificamente, ele pode testar se ele tem uma permissão específica chamando o método Demand na instância da permissão desejada. Isso é mostrado no exemplo a seguir, que tem código que consulta se ele tem a capacidade de salvar um arquivo no disco 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

Se um aplicativo não tiver a permissão desejada, a chamada para Demand gerará uma exceção de segurança. Caso contrário, a permissão foi concedida. IsPermissionGranted encapsula esse comportamento e retorna true ou false, conforme apropriado.

Degradação gradual de funcionalidade

Ser capaz de detectar se o código tem permissão para fazer o que precisa fazer é interessante para o código que pode ser executado de diferentes zonas. Embora detectar a zona seja uma coisa, é muito melhor fornecer uma alternativa para o usuário, se possível. Por exemplo, um aplicativo de confiança total normalmente permite que os usuários criem arquivos em qualquer lugar desejado, enquanto um aplicativo de confiança parcial só pode criar arquivos no armazenamento isolado. Se o código para criar um arquivo existir em um assembly compartilhado por aplicativos de confiança total (autônomos) e aplicativos de confiança parcial (hospedados pelo navegador) e ambos os aplicativos desejarem que os usuários possam criar arquivos, o código compartilhado deverá detectar se ele está em execução em confiança parcial ou total antes de criar um arquivo no local apropriado. O código a seguir demonstra ambos.

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

Em muitos casos, você deve ser capaz de encontrar uma alternativa de confiança parcial.

Em um ambiente controlado, como uma intranet, estruturas gerenciadas personalizadas podem ser instaladas no GAC (cache de assembly global) em toda a base de clientes. Essas bibliotecas podem executar código que requer confiança total e ser referenciadas a partir de aplicativos que são permitidos apenas confiança parcial usando AllowPartiallyTrustedCallersAttribute (para obter mais informações, consulte Segurança e Estratégia de Segurança do WPF – Segurança da Plataforma).

Detecção de host do navegador

Usar o CAS para verificar permissões é uma técnica adequada quando você precisa verificar cada permissão individualmente. Embora essa técnica dependa da captura de exceções como parte do processamento normal, o que não é recomendado em geral e pode ter problemas de desempenho. Em vez disso, se o seu aplicativo de navegador XAML (XBAP) for executado apenas na área restrita da zona de Internet, você poderá usar a propriedade BrowserInteropHelper.IsBrowserHosted, que retorna true para XBAPs (aplicativos de navegador XAML).

Aviso

Os XBAPs exigem que navegadores herdados operem, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não têm suporte no Windows 10 e no Windows 11. Os navegadores modernos não dão mais suporte à tecnologia necessária para aplicativos XBAP devido a riscos de segurança. Plug-ins que habilitam XBAPs não têm mais suporte. Para obter mais informações, consulte Perguntas frequentes sobre oXBAP (aplicativos hospedados por navegador) do WPF.

Nota

IsBrowserHosted só distingue se um aplicativo está em execução em um navegador, não com qual conjunto de permissões um aplicativo está em execução.

Gerenciando permissões

Por padrão, os XBAPs são executados com confiança parcial (conjunto de permissões de zona da Internet padrão). No entanto, dependendo dos requisitos do aplicativo, é possível alterar o conjunto de permissões do padrão. Por exemplo, se um XBAPs for iniciado de uma intranet local, ele poderá aproveitar um conjunto de permissões maior, que é mostrado na tabela a seguir.

Aviso

Os XBAPs exigem que navegadores herdados operem, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não têm suporte no Windows 10 e no Windows 11. Os navegadores modernos não dão mais suporte à tecnologia necessária para aplicativos XBAP devido a riscos de segurança. Plug-ins que habilitam XBAPs não têm mais suporte. Para obter mais informações, consulte Perguntas frequentes sobre oXBAP (aplicativos hospedados por navegador) do WPF.

Tabela 3: LocalIntranet e Permissões de Internet

Permissão Atributo LocalIntranet Internet
DNS Acessar servidores DNS Sim Não
Variáveis de ambiente Ler Sim Não
Caixas de diálogo de arquivo Abrir Sim Sim
Caixas de diálogo de arquivo Irrestrito Sim Não
Armazenamento isolado Isolamento de assembly por usuário Sim Não
Armazenamento isolado Isolamento desconhecido Sim Sim
Armazenamento isolado Cota de usuário ilimitada Sim Não
Mídia Áudio, vídeo e imagens seguros Sim Sim
Impressão Impressão padrão Sim Não
Impressão Impressão segura Sim Sim
Reflexão Emitir Sim Não
Segurança Execução de código gerenciado Sim Sim
Segurança Permissões concedidas pela Assert Sim Não
Interface do Usuário Irrestrito Sim Não
Interface do Usuário Janelas de nível superior seguras Sim Sim
Interface do Usuário Área de transferência própria Sim Sim
Navegador da Web Navegação do quadro seguro para HTML Sim Sim

Nota

Recortar e colar só é permitido em confiança parcial quando iniciada pelo usuário.

Se você precisar aumentar as permissões, precisará alterar as configurações do projeto e o manifesto do aplicativo ClickOnce. Para obter mais informações, consulte Visão Geral dos Aplicativos WPF XAML para Navegador. Os documentos a seguir também podem ser úteis.

Se o XBAP exigir confiança total, você poderá usar as mesmas ferramentas para aumentar as permissões solicitadas. Embora um XBAP receba confiança total somente se ele estiver instalado e iniciado do computador local, da intranet ou de uma URL listada nos sites confiáveis ou permitidos do navegador. Se o aplicativo estiver instalado da intranet ou de um site confiável, o usuário receberá o prompt clickOnce padrão notificando-os das permissões com privilégios elevados. O usuário pode optar por continuar ou cancelar a instalação.

Como alternativa, você pode usar o modelo de Implantação Confiável do ClickOnce para implantação de confiança total de qualquer zona de segurança. Para obter mais informações, consulte a Visão Geral de Implantação de Aplicativos Confiáveis e Segurança .

Consulte também