Partilhar via


Segurança de confiança parcial do WPF

Em geral, as aplicações da Internet devem ser impedidas de ter acesso direto a recursos críticos do sistema, para evitar danos maliciosos. Por padrão, HTML e linguagens de script do lado do cliente não são capazes de acessar recursos críticos do sistema. Como os aplicativos hospedados no navegador Windows Presentation Foundation (WPF) 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 da Segurança de Acesso ao Código (CAS) e do ClickOnce (consulte Estratégia de Segurança do WPF - Segurança da Plataforma). Por padrão, os aplicativos hospedados no navegador solicitam o conjunto de permissões CAS da zona da Internet, independentemente de serem iniciados a partir da Internet, da intranet local ou do computador local. Diz-se que os aplicativos executados com qualquer coisa menos do que o conjunto completo de permissões estão sendo executados 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:

Suporte para confiança parcial na funcionalidade WPF

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

Tabela 1: Recursos do WPF que são seguros em confiança parcial

Área de Destaque Funcionalidade
Geral Janela do navegador

Acesso ao Site de Origem

IsolatedStorage (limite de 512KB)

Provedores de UIAutomation

Comando

Editores de método de entrada (IMEs)

Caneta e tinta para tablet

Simulação de arrastar/soltar usando eventos de captura e movimentação do mouse

OpenFileDialog

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

Top-Level User-Initiated Navegação

mailto:ligações

Parâmetros do identificador uniforme de recursos

HTTPWebRequest

Conteúdo WPF hospedado em um IFRAME

Hospedagem de páginas HTML 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)

Criação de scripts

Modelo de objeto do documento
Elementos visuais 2D e 3D

Animação

Media (Site de Origem e Cross-Domain)

Imagem/Áudio/Vídeo
Leitura FlowDocuments

Documentos XPS

Fontes de sistema & incorporadas

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

RichTextBox

Suporte para a área de transferência de texto simples e de tinta

User-Initiated Colar

Copiando o conteúdo selecionado
Controlos Controlos Gerais

Esta tabela abrange 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, as funcionalidades a seguir têm informações mais detalhadas sobre a execução de 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 Destaque Funcionalidade
Geral Janela (janelas definidas pelo aplicativo e caixas de diálogo)

Diálogo de Gravação de Ficheiro

Sistema de arquivos

Acesso ao Registo

Arrastar e soltar

Serialização XAML (via XamlWriter.Save)

Clientes UIAutomation

Acesso à janela de origem (HwndHost)

Suporte total de fala

Interoperabilidade do Windows Forms
Elementos visuais Efeitos de bitmap

Codificação de Imagem
Edição Área de transferência em formato Rich Text

Suporte completo a XAML

Programação de confiança parcial

Para aplicativos XBAP, o código que excede 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 quando 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 confiança total.

Advertência

Os XBAPs requerem navegadores herdados para funcionar, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não são suportados no Windows 10 e no Windows 11. Os navegadores modernos não suportam mais a tecnologia necessária para aplicativos XBAP devido a riscos de segurança. Plug-ins que habilitam XBAPs não são mais suportados. Para obter mais informações, consulte Perguntas freqüentes sobre aplicativos hospedados no navegador WPF (XBAP).

Zona de Segurança Comportamento Obter confiança total
Computador local Confiança total automática Nenhuma ação é necessária.
Intranet e sites confiáveis Solicitar 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" Assine o XBAP com um certificado.

Observação

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 no navegador. O CAS e o WPF oferecem várias técnicas para gerenciar esse cenário.

Detetando permissões usando 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 funcionalidades que podem exigir mais permissões do que o conjunto de permissões concedido pelo aplicativo permite. Seu aplicativo pode detetar se ele tem ou não uma determinada permissão usando a segurança do Microsoft .NET Framework. Especificamente, ele pode testar se 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 lançará uma exceção de segurança. Caso contrário, a permissão foi concedida. IsPermissionGranted encapsula esse comportamento e retorna true ou false quando apropriado.

Degradação graciosa da funcionalidade

Ser capaz de detetar se o código tem a permissão para fazer o que precisa fazer é interessante para o código que pode ser executado a partir de diferentes zonas. Embora detetar 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 onde quiserem, enquanto um aplicativo de confiança parcial só pode criar arquivos em armazenamento isolado. Se o código para criar um arquivo existir em um assembly que é compartilhado por aplicativos de confiança total (autônomos) e aplicativos de confiança parcial (hospedados pelo navegador), e ambos os aplicativos querem que os usuários possam criar arquivos, o código compartilhado deve detetar se ele está sendo executado 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 em toda a base de clientes no cache de assembly global (GAC). Essas bibliotecas podem executar código que requer confiança total e ser referenciadas a partir de aplicativos que só têm confiança parcial permitida usando AllowPartiallyTrustedCallersAttribute (para obter mais informações, consulte Security e WPF Security Strategy - Platform Security).

Deteção de host do navegador

Utilizar o CAS para verificar permissões é uma técnica adequada quando é necessário verificar cada permissão individualmente. No entanto, esta técnica depende 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 seu aplicativo de navegador XAML (XBAP) só for executado dentro da área restrita da zona da Internet, você poderá usar a propriedade BrowserInteropHelper.IsBrowserHosted, que retornará true para aplicativos de navegador XAML (XBAPs).

Advertência

Os XBAPs requerem navegadores herdados para funcionar, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não são suportados no Windows 10 e no Windows 11. Os navegadores modernos não suportam mais a tecnologia necessária para aplicativos XBAP devido a riscos de segurança. Plug-ins que habilitam XBAPs não são mais suportados. Para obter mais informações, consulte Perguntas freqüentes sobre aplicativos hospedados no navegador WPF (XBAP).

Observação

IsBrowserHosted apenas distingue se um aplicativo está sendo executado em um navegador, não com qual conjunto de permissões um aplicativo está sendo executado.

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 a partir de uma intranet local, ele poderá aproveitar um conjunto de permissões aumentado, que é mostrado na tabela a seguir.

Advertência

Os XBAPs requerem navegadores herdados para funcionar, como o Internet Explorer e versões antigas do Firefox. Esses navegadores mais antigos geralmente não são suportados no Windows 10 e no Windows 11. Os navegadores modernos não suportam mais a tecnologia necessária para aplicativos XBAP devido a riscos de segurança. Plug-ins que habilitam XBAPs não são mais suportados. Para obter mais informações, consulte Perguntas freqüentes sobre aplicativos hospedados no navegador WPF (XBAP).

Tabela 3: Permissões de LocalIntranet e Internet

Permissão Atributo Intranet local Internet
DNS Aceder a servidores DNS Sim Não
Variáveis de ambiente Ler Sim Não
Caixas de diálogo de ficheiro Aberto Sim Sim
Diálogos de ficheiro Sem restrições Sim Não
Armazenamento isolado Isolamento de montagem por usuário Sim Não
Armazenamento isolado Isolamento desconhecido Sim Sim
Armazenamento isolado Quota de utilizador 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 Emissão Sim Não
Segurança Execução de código gerenciado Sim Sim
Segurança Afirmar permissões concedidas Sim Não
Interface do usuário Sem restrições 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 segura de quadros para HTML Sim Sim

Observação

Recortar e colar só é permitido em ambiente de confiança parcial quando iniciado pelo utilizador.

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 de aplicativos de navegador WPF XAML. Os seguintes documentos também podem ser úteis.

Se o seu XBAP requer confiança total, você pode usar as mesmas ferramentas para aumentar as permissões solicitadas. Embora um XBAP só receba confiança total se for instalado e iniciado a partir do computador local, da intranet ou de um URL listado nos sites confiáveis ou permitidos do navegador. Se o aplicativo for instalado a partir da intranet ou de um site confiável, o usuário receberá o prompt padrão do ClickOnce notificando-o sobre as permissões elevadas. O usuário pode optar por continuar ou cancelar a instalação.

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

Ver também