Segurança parcialmente confiável do WPF

Em geral, os aplicativos da Internet devem ter acesso restrito aos recursos críticos do sistema, para evitar danos mal-intencionados. 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 do 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 do CAS (Segurança de Acesso ao Código) 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. Aplicativos que são executados com nada menos do que o conjunto completo de permissões devem ser 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:

Segurança parcialmente confiável do recurso de 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 da zona da Internet.

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

Área de recurso Recurso
Geral Janela do Navegador

Local do acesso de origem

IsolatedStorage (limite de 512KB)

Provedores de UIAutomation

Comando

IMEs (Editores de Método de Entrada)

Tinta e caneta eletrônica

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 iniciada pelo usuário de nível superior

mailto:links

Parâmetros do Uniform Resource Identifier

HTTPWebRequest

Conteúdo do WPF hospedado em um IFRAME

Hospedagem de páginas do mesmo Site HTML usando o quadro

Hospedagem de páginas do mesmo Site HTML usando o navegador da Web

Serviços Web (ASMX)

Serviços Web (usando o Windows Communication Foundation)

Scripting

Modelo de Objeto do Documento
Visuais 2D e 3D

Animação

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

Geração de imagens/áudio/vídeo
Lendo FlowDocuments

Documentos XPS

Fontes internas e do sistema

Fontes CFF e TrueType
Edição Verificação de ortografia

RichTextBox

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

Colar iniciado pelo usuário

Copiando conteúdo selecionado
Controls Controles gerais

Esta tabela cobre 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 de WPF que não estão seguros em confiança parcial

Área de recurso Recurso
Geral Janela (Caixas de diálogo e janelas definidas pelo aplicativo)

SaveFileDialog

File System

Acesso ao Registro

Arrastar e soltar

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

Clientes de UIAutomation

Acesso à fonte de janela (HwndHost)

Suporte completo à fala

Interoperabilidade dos Windows Forms
Visuais Efeitos de bitmap

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

Suporte completo para XAML

Programação de confiança parcial

Para aplicativos XBAP, o código que excede o conjunto de permissões padrão terá 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 confiança total.

Aviso

XBAPs exigem navegadores herdados para operar, como Internet Explorer e Firefox. Essas versões mais antigas do navegador geralmente não são suportadas 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. Plugins que habilitam XBAPs não são mais suportados.

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

Observação

O comportamento descrito na tabela anterior é de confiança total XBAPs que não seguem o modelo de implantação do ClickOnce confiáveis.

Em geral, o código que pode exceder as permissões permitidas é provavelmente código comum que é compartilhado entre autônomos e aplicativos hospedados pelo navegador. O CAS e o 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, código pode executar funcionalidades que podem exigir mais permissões do que o conjunto de permissões que o 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 Demand método na instância da permissão desejada. Isso é mostrado no exemplo a seguir, que tem código que consulta para que tenha 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 lançará uma exceção de Demand 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 em diferentes regiões. Ao detectar a zona é uma coisa, que é muito melhor fornecer uma alternativa para o usuário, se possível. Por exemplo, um aplicativo de confiança total geralmente permite aos usuários criar arquivos em qualquer lugar que querem, embora um aplicativo parcialmente confiável só pode criar arquivos no armazenamento isolado. Se o código para criar um arquivo existe em um assembly que é compartilhado por aplicativos de confiança total (autônomo) e aplicativos de confiança parcial (online) e ambos os aplicativos deseja que os usuários criem 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 a 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 na base de clientes no GAC (cache de assembly global). Essas bibliotecas podem executar código que requer confiança total e ser referenciadas a partir de aplicativos que só são permitidos confiança parcial usando AllowPartiallyTrustedCallersAttribute (para obter mais informações, consulte Segurança e Estratégia de segurança 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 por permissão. No entanto, essa técnica depende capturar exceções como uma parte normal processamento, 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 BrowserInteropHelper.IsBrowserHosted propriedade, que retorna true para aplicativos de navegador XAML (XBAPs).

Aviso

XBAPs exigem navegadores herdados para operar, como Internet Explorer e Firefox. Essas versões mais antigas do navegador geralmente não são suportadas 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. Plugins que habilitam XBAPs não são mais suportados.

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 padrão. Por exemplo, se um XBAPs for iniciado a partir de uma intranet local, ele poderá aproveitar um conjunto de permissões maior, que é mostrado na tabela a seguir.

Aviso

XBAPs exigem navegadores herdados para operar, como Internet Explorer e Firefox. Essas versões mais antigas do navegador geralmente não são suportadas 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. Plugins que habilitam XBAPs não são mais suportados.

Tabela 3: Permissões de Intranet Local e de Internet

Permissão Atributo Intranet Local Internet
DNS Acessar Servidores DNS Sim Não
Variáveis de ambiente Ler Sim Não
Caixas de diálogo de arquivo Aberto Sim Yes
Caixas de diálogo de arquivo Irrestrito Sim Não
Armazenamentos isolado Isolamento de assembly por usuário Sim Não
Armazenamentos isolado Isolamento desconhecido Sim Yes
Armazenamentos isolado Cota de usuário ilimitada Sim Não
Mídia Imagens, vídeo e áudio seguro Sim Yes
Imprimindo Impressão padrão Sim Não
Imprimindo Impressão segura Sim Yes
Reflexão Emitir Sim Não
Segurança Execução de código gerenciado Sim Sim
Segurança Declarar permissões concedidas Sim Não
Interface do Usuário Irrestrito Sim Não
Interface do Usuário Windows de nível de segurança superior Sim Yes
Interface do Usuário Área de transferência própria Sim Yes
Navegador da Web Navegação do quadro seguro para HTML Sim Sim

Observação

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

Se você precisar aumentar as permissões, você 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 XAML WPF. Os documentos a seguir também podem ser úteis.

Se o seu XBAP exigir confiança total, você poderá 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 uma URL listada nos sites confiáveis ou permitidos do navegador. Se o aplicativo for instalado da intranet ou em um site confiável, o usuário receberá o prompt ClickOnce padrão notificando sobre as 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 do ClickOnce confiáveis para implantação de confiança total de qualquer zona de segurança. Para obter mais informações, consulte Visão geral da implantação de aplicativos confiáveis e segurança.

Confira também