WPF Partial Trust Security
In general, Internet applications should be restricted from having direct access to critical system resources, to prevent malicious damage. By default, HTML and client-side scripting languages are not able to access critical system resources. Because Windows Presentation Foundation (WPF) browser-hosted applications can be launched from the browser, they should conform to a similar set of restrictions. To enforce these restrictions, WPF relies on both Code Access Security (CAS) and ClickOnce (see Estratégia de segurança do WPF - Segurança da Plataforma). Por padrão, os aplicativos hospedados por navegador solicitam a zona da Internet CAS conjunto de permissões, independentemente se eles são iniciados a partir da Internet, intranet local ou o computador local. Applications that run with anything less than the full set of permissions are said to be running with partial trust.
WPF provides a wide variety of support to ensure that as much functionality as possible can be used safely in partial trust, and along with CAS, provides additional support for partial trust programming.
This topic contains the following sections:
WPF Feature Partial Trust Support
Partial Trust Programming
Managing Permissions
WPF Feature Partial Trust Support
A tabela a seguir lista os recursos de alto nível das Windows Presentation Foundation (WPF) que são seguros dentro dos limites do conjunto de permissão do Internet a zona.
Tabela 1: Recursos do WPF que são aceitas em confiança parcial
Feature Area |
Feature |
---|---|
General |
Browser Window Site of Origin Access IsolatedStorage (512KB Limit) UIAutomation Providers Commanding Input Method Editors (IMEs) Tablet Stylus and Ink Simulated Drag/Drop using Mouse Capture and Move Events OpenFileDialog XAML Deserialization (via XamlReader.Load) |
Web Integration |
Browser Download Dialog Top-Level User-Initiated Navigation mailto:links Uniform Resource Identifier Parameters HTTPWebRequest WPF Content Hosted in an IFRAME Hospedagem de páginas de HTML do mesmo Site usando o quadro Hospedagem de páginas de HTML do mesmo Site usando o WebBrowser Web Services (ASMX) Web Services (using Windows Communication Foundation) Scripting Document Object Model |
Visuals |
2D and 3D Animation Media (Site Of Origin and Cross-Domain) Imaging/Audio/Video |
Reading |
FlowDocuments XPS Documents Embedded & System Fonts CFF & TrueType Fonts |
Editing |
Spell Checking RichTextBox Plaintext and Ink Clipboard Support User-Initiated Paste Copying Selected Content |
Controls |
General Controls |
This table covers the WPF features at a high level. For more detailed information, the Windows Software Development Kit (SDK) documents the permissions that are required by each member in WPF. Além disso, os recursos a seguir possuem informações mais detalhadas sobre a execução de confiança parcial, incluindo considerações especiais.
XAML (see Visão geral do XAML (WPF)).
Popups (see System.Windows.Controls.Primitives.Popup).
Drag and Drop (see Visão geral sobre arrastar e soltar).
Clipboard (see System.Windows.Clipboard).
Imaging (see System.Windows.Controls.Image).
Serialization (see XamlReader.Load, XamlWriter.Save).
Open File Dialog Box (see Microsoft.Win32.OpenFileDialog).
A tabela a seguir descreve o WPF recursos que são não seguros executar dentro dos limites do conjunto de permissão do Internet a zona.
Tabela 2: Recursos de WPF não seguros em confiança parcial
Feature Area |
Feature |
---|---|
General |
Window (Application Defined Windows and Dialog Boxes) SaveFileDialog File System Registry Access Drag and Drop XAML Serialization (via XamlWriter.Save) UIAutomation Clients Source Window Access (HwndHost) Full Speech Support Windows Forms Interoperability |
Visuals |
Bitmap Effects Image Encoding |
Editing |
Rich Text Format Clipboard Full XAML support |
Partial Trust Programming
Para XBAP aplicativos de 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 eles tentam 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 |
Behavior |
Obtendo a 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 |
Assine XBAP com um certificado para que o usuário vê a fonte no prompt. |
Internet |
Falha com "Confiança não concedida" |
Assine um 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 confiável de ClickOnce.
Em geral, o código que pode exceder as permissões concedidas provavelmente será o código comum compartilhado entre autônomos e aplicativos hospedados em navegador. CASe WPF oferecem várias técnicas para gerenciar esse cenário.
Detecting Permissions Using CAS
In some situations, it is possible for shared code in library assemblies to be used by both standalone applications and XBAPs. In these cases, code may execute functionality that could require more permissions than the application's awarded permission set allows. Your application can detect whether or not it has a certain permission by using Microsoft .NET Framework security. Specifically, it can test whether it has a specific permission by calling the Demand method on the instance of the desired permission. This is shown in the following example, which has code that queries for whether it has the ability to save a file to the local disk:
Imports System.IO ' File, FileStream, StreamWriter
Imports System.IO.IsolatedStorage ' IsolatedStorageFile
Imports System.Security ' CodeAccesPermission, IsolatedStorageFileStream
Imports System.Security.Permissions ' FileIOPermission, FileIOPermissionAccess
Imports System.Windows ' MessageBox
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
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. IsPermissionGrantedencapsula esse comportamento e retorna true ou false conforme apropriado.
Graceful Degradation of Functionality
Being able to detect whether code has the permission to do what it needs to do is interesting for code that can be executed from different zones. While detecting the zone is one thing, it is far better to provide an alternative for the user, if possible. For example, a full trust application typically enables users to create files anywhere they want, while a partial trust application can only create files in isolated storage. Se o código para criar um arquivo existe em um assembly que é compartilhado por aplicativos de confiança parcial (hospedado no navegador) e de aplicativos de confiança total (autônomo), e ambos os aplicativos que os usuários possam criar arquivos, o código compartilhado deve detectar se ele está sendo executado em confiança parcial ou completa antes de criar um arquivo no local apropriado. O código a seguir demonstra a ambos.
Imports System.IO ' File, FileStream, StreamWriter
Imports System.IO.IsolatedStorage ' IsolatedStorageFile
Imports System.Security ' CodeAccesPermission
Imports System.Security.Permissions ' FileIOPermission, FileIOPermissionAccess
Imports System.Windows ' MessageBox
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
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;
}
}
...
}
}
In many cases, you should be able to find a partial trust alternative.
In a controlled environment, such as an intranet, custom managed frameworks can be installed across the client base into the global assembly cache (GAC). Essas bibliotecas podem executar o código que requer confiança total e ser acessadas a partir de 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).
Browser Host Detection
Using CAS to check for permissions is a suitable technique when you need to check on a per-permission basis. Embora essa técnica depende capturar exceções como parte normal processamento, que não é recomendado em geral e pode ter problemas de desempenho. Em vez disso, se sua XAML browser application (XBAP) só é executado em modo seguro da zona da Internet, você pode usar o BrowserInteropHelper.IsBrowserHosted propriedade, que retorna true para XAML browser applications (XBAPs).
Observação
IsBrowserHostedsomente distingue se um aplicativo é executado em um navegador, não qual conjunto de permissões de um aplicativo está sendo executado com.
Managing Permissions
Por padrão, XBAPs executado com confiança parcial (conjunto de permissões de zona de Internet do padrão). However, depending on the requirements of the application, it is possible to change the set of permissions from the default. Por exemplo, se um XBAPs é iniciado a partir de uma intranet local, pode se beneficiar de um conjunto maior de permissão, que é mostrado na tabela a seguir.
Tabela 3: LocalIntranet e permissões de Internet
Permission |
Attribute |
LocalIntranet |
Internet |
---|---|---|---|
DNS |
Access DNS servers |
Yes |
No |
Environment Variables |
Read |
Yes |
No |
File Dialogs |
Abrir |
Yes |
Yes |
File Dialogs |
Unrestricted |
Yes |
No |
Isolated Storage |
Assembly isolation by user |
Yes |
No |
Isolated Storage |
Unknown isolation |
Yes |
Yes |
Isolated Storage |
Unlimited user quota |
Yes |
No |
Media |
Safe audio, video, and images |
Yes |
Yes |
Printing |
Default printing |
Yes |
No |
Printing |
Safe printing |
Yes |
Yes |
Reflection |
Emit |
Yes |
No |
Security |
Managed code execution |
Yes |
Yes |
Security |
Assert granted permissions |
Yes |
No |
User Interface |
Unrestricted |
Yes |
No |
User Interface |
Safe top level windows |
Yes |
Yes |
User Interface |
Own Clipboard |
Yes |
Yes |
Web Browser |
Safe frame navigation to HTML |
Yes |
Yes |
Observaçã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. For more information, see Visão geral sobre WPF XAML Browser Applications. Os seguintes documentos também podem ser úteis.
Se sua XBAP requer confiança total, você pode usar as mesmas ferramentas para aumentar as permissões solicitadas. Embora um XBAP somente receber confiança total se ele estiver instalado em e iniciado a partir do computador local, intranet, ou uma URL que está listada no navegador da confiável ou permitido sites. Se o aplicativo é instalado a partir da intranet ou um site confiável, o usuário receberá o prompt de ClickOnce padrão, notificando sobre 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 de ClickOnce para a implantação de confiança total de qualquer zona de segurança. For more information, see Visão geral sobre implantação de aplicativos confiáveis and Segurança (WPF).