Este artigo foi traduzido por máquina. Para visualizar o arquivo em inglês, marque a caixa de seleção Inglês. Você também pode exibir o texto Em inglês em uma janela pop-up, movendo o ponteiro do mouse sobre o texto.
Tradução
Inglês

Segurança de confiança parcial do WPF

 

Publicado: junho de 2016

Em geral, aplicações de Internet devem ser impedidas de ter acesso direto aos 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. Porque Windows Presentation Foundation (WPF) aplicativos hospedados pelo navegador podem ser iniciados a partir do navegador, eles devem estar de acordo com um conjunto semelhante de restrições. Para impor essas restrições, WPF se baseia no CAS (Segurança de Acesso do Código) e ClickOnce (consulte Estratégia de segurança do WPF - segurança da plataforma). Por padrão, os aplicativos hospedados pelo navegador solicitam a zona da Internet CAS conjunto de permissões, independentemente se eles são lançados a partir da Internet, intranet local ou no 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.

WPF Fornece uma ampla variedade de suporte para garantir que tanta funcionalidade possível pode ser usada com segurança em confiança parcial e juntamente com CAS, fornece suporte adicional para a programação de confiança parcial.

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

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

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

Área de Recurso

Característica

Geral

Janela do navegador

Site do acesso de origem

IsolatedStorage (limite de 512KB)

Provedores de automação da IU

Comandos

Editores de método de entrada (IMEs)

Tinta e caneta eletrônica

Arrastar/soltar simulada usando eventos mover e captura do Mouse

OpenFileDialog

Desserialização de XAML (via XamlReader)

Integração WEB

Caixa de diálogo de Download de navegador

Navegação iniciada pelo usuário de nível superior

mailto:links

Parâmetros de identificador de recurso uniforme

HTTPWebRequest

Conteúdo do WPF hospedado em um IFRAME

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

Hospedagem do mesmo Site HTML páginas usando WebBrowser

Serviços Web (ASMX)

Serviços da Web (usando o Windows Communication Foundation)

Script

Modelo de objeto de documento

Visuais

2D e 3D

Animação

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

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

Leitura

FlowDocuments

Documentos XPS

Incorporado & fontes do sistema

CFF & fontes 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

Copiar o conteúdo selecionado

Controles

Controles Gerais

Esta tabela abrange o WPF recursos em um alto nível. Para obter mais informações, o Windows Software Development Kit (SDK) 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 o WPF conjunto de permissões da zona de recursos que não são seguros para execução dentro dos limites da Internet.

Tabela 2: WPF recursos não seguros em confiança parcial

Área de Recurso

Característica

Geral

Janela (Windows definido do aplicativo e caixas de diálogo)

SaveFileDialog

Sistema de Arquivos

Registro de Acesso

Arrastar e soltar

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

Clientes de automação da IU

Acesso à fonte de janela (HwndHost)

Suporte completo à 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 para XAML

Para XBAP aplicativos, 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 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 o aplicativo receber confiança total.

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

Prompt para confiança total

Assinar XBAP com um certificado para que o usuário vê o código-fonte no prompt.

Internet

Falha com "Não foi concedida confiança"

Assine XBAP com um certificado.

System_CAPS_noteObservaçã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.CAS e WPF oferecem várias técnicas para gerenciar esse cenário.

Em algumas situações, é possível para o código compartilhado em assemblies de biblioteca a ser 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 concedidos do aplicativo permite. Seu aplicativo pode detectar se ele tem uma determinada permissão usando ou não Microsoft .NET Framework segurança. Especificamente, ele pode testar se ele tem uma permissão específica ao chamar o Demand método na instância da permissão desejada. Isso é mostrado no exemplo a seguir, que tem código que a consulta para que tenha a capacidade de salvar um arquivo no disco local:

using System.IO; // File, FileStream, StreamWriter
using System.IO.IsolatedStorage; // IsolatedStorageFile
using System.Security; // CodeAccesPermission, IsolatedStorageFileStream
using System.Security.Permissions; // FileIOPermission, FileIOPermissionAccess
using System.Windows; // MessageBox

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;
            }
        }

    }
}

Se um aplicativo não tem 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 conforme apropriado.

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 a partir de diferentes zonas. 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 deve detectar se ele está em execução em confiança parcial ou completa antes de criar um arquivo no local apropriado. O código a seguir demonstra a ambos.

using System.IO; // File, FileStream, StreamWriter
using System.IO.IsolatedStorage; // IsolatedStorageFile
using System.Security; // CodeAccesPermission
using System.Security.Permissions; // FileIOPermission, FileIOPermissionAccess
using System.Windows; // MessageBox

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;
            }
        }

    }
}

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 entre o cliente com base no GAC (cache de assembly global). Essas bibliotecas podem executar o código que requer confiança total e ser referenciadas por aplicativos que são permitidos apenas parcialmente confiáveis usando AllowPartiallyTrustedCallersAttribute (para obter mais informações, consulte Segurança (WPF) e Estratégia de segurança do WPF - segurança da plataforma).

Usando CAS Verificar permissões é uma técnica adequada quando você precisa verificar em uma base 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 XBAP (aplicativo de navegação XAML) só é executada em modo seguro de zona da Internet, você pode usar o BrowserInteropHelper.IsBrowserHosted propriedade, que retorna verdadeira para XBAPs (aplicativos de navegador XAML).

System_CAPS_noteObservação

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

Por padrão, XBAPs executados com confiança parcial (conjunto de permissões de zona de 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 é iniciado de uma intranet local, ele pode tirar proveito de um conjunto maior de permissão, que é mostrado na tabela a seguir.

Tabela 3: LocalIntranet e permissões de Internet

Permissão

Atributo

LocalIntranet

Internet

DNS

Servidores DNS de acesso

Sim

Não

Variáveis de Ambiente

Leitura

Sim

Não

Caixas de diálogo de arquivo

Abrir

Sim

Sim

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

Sim

Armazenamentos isolado

Cota de usuário ilimitada

Sim

Não

Mídia

Imagens, vídeo e áudio seguro

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 gerenciada

Sim

Sim

Segurança

Afirmar permissões concedidas

Sim

Não

Interface de usuário

Irrestrito

Sim

Não

Interface de usuário

Windows de nível de segurança superior

Sim

Sim

Interface de usuário

Área de transferência própria

Sim

Sim

Navegador Web

Navegação do quadro seguro para HTML

Sim

Sim

System_CAPS_noteObservação

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

Se você precisar aumentar as permissões, você precisa 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 útil.

Se seu XBAP requer confiança total, você pode usar as mesmas ferramentas para aumentar as permissões solicitadas. Embora um XBAP só recebe confiança total se estiver instalado e iniciado no computador local, intranet, ou de uma URL que está listada no navegador de confiáveis ou sites permitidos. Se o aplicativo é instalado da intranet ou 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 Trusted Application Deployment Overview e Segurança (WPF).

Mostrar: