Seguridad de confianza parcial de WPFWPF Partial Trust Security

En general, deben restringirse las aplicaciones de Internet para que no tengan acceso directo a recursos críticos del sistema y así evitar daños malintencionados.In general, Internet applications should be restricted from having direct access to critical system resources, to prevent malicious damage. De forma predeterminada, los lenguajes de scripting de HTML y de cliente no pueden tener acceso a los recursos críticos del sistema.By default, HTML and client-side scripting languages are not able to access critical system resources. Dado que las aplicaciones hospedadas en un explorador Windows Presentation Foundation (WPF) se pueden iniciar desde el explorador, deben ajustarse a un conjunto similar de restricciones.Because Windows Presentation Foundation (WPF) browser-hosted applications can be launched from the browser, they should conform to a similar set of restrictions. Para aplicar estas restricciones, WPFWPF se basa en la seguridad de acceso del código (CAS) y en ClickOnce (consulte estrategia de seguridad de WPF: seguridad de plataforma).To enforce these restrictions, WPFWPF relies on both Code Access Security (CAS) and ClickOnce (see WPF Security Strategy - Platform Security). De forma predeterminada, las aplicaciones hospedadas en el explorador solicitan el conjunto de permisos de la zona de Internet, independientemente de si se inician desde Internet, la Intranet local o el equipo local.By default, browser-hosted applications request the Internet zone CAS set of permissions, irrespective of whether they are launched from the Internet, the local intranet, or the local computer. Las aplicaciones que se ejecutan con menos permisos que el conjunto completo de permisos se dice que se ejecutan con confianza parcial.Applications that run with anything less than the full set of permissions are said to be running with partial trust.

WPFWPFproporciona una amplia variedad de compatibilidad para garantizar que tanta funcionalidad como sea posible se pueda usar de forma segura en confianza parcial y, junto con las CA, proporciona compatibilidad adicional para la programación de confianza parcial.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.

Este tema contiene las siguientes secciones:This topic contains the following sections:

Compatibilidad de confianza parcial de las características de WPFWPF Feature Partial Trust Support

En la tabla siguiente se enumeran las características de alto nivel de Windows Presentation Foundation (WPF) que se pueden usar con seguridad dentro de los límites del conjunto de permisos de la zona de Internet.The following table lists the high-level features of Windows Presentation Foundation (WPF) that are safe to use within the limits of the Internet zone permission set.

Tabla 1: Características de WPF que son seguras en confianza parcialTable 1: WPF Features that are Safe in Partial Trust

Área de característicasFeature Area CaracterísticaFeature
GeneralGeneral Ventana del exploradorBrowser Window

Acceso al sitio de origenSite of Origin Access

IsolatedStorage (límite de 512 KB)IsolatedStorage (512KB Limit)

Proveedores de UIAutomationUIAutomation Providers

ComandosCommanding

Editores de métodos de entrada (IMEs)Input Method Editors (IMEs)

Lápiz y entrada de lápiz de tabletaTablet Stylus and Ink

Movimiento simulado de arrastrar y colocar con los eventos de captura y movimiento del mouseSimulated Drag/Drop using Mouse Capture and Move Events

OpenFileDialogOpenFileDialog

Deserialización XAML (mediante XamlReader.Load)XAML Deserialization (via XamlReader.Load)
Integración en InternetWeb Integration Cuadro de diálogo de descarga del exploradorBrowser Download Dialog

Navegación iniciada por el usuario de nivel superiorTop-Level User-Initiated Navigation

mailto:linksmailto:links

Parámetros de identificador de recursos uniformeUniform Resource Identifier Parameters

HTTPWebRequestHTTPWebRequest

Contenido de WPF hospedado en un IFRAMEWPF Content Hosted in an IFRAME

Hospedaje de páginas HTML del mismo sitio con marcoHosting of Same-Site HTML Pages using Frame

Hospedaje de páginas HTML del mismo sitio con WebBrowserHosting of Same Site HTML Pages using WebBrowser

Servicios web (ASMX)Web Services (ASMX)

Servicios Web (con Windows Communication Foundation)Web Services (using Windows Communication Foundation)

ScriptingScripting

Modelo de objetos de documentoDocument Object Model
Objetos visualesVisuals 2D y 3D2D and 3D

AnimaciónAnimation

Multimedia (sitio de origen y entre dominios)Media (Site Of Origin and Cross-Domain)

Creación de imágenes, audio y vídeoImaging/Audio/Video
LecturaReading FlowDocumentsFlowDocuments

Documentos XPSXPS Documents

Fuentes insertadas y del sistemaEmbedded & System Fonts

Fuentes CFF y TrueTypeCFF & TrueType Fonts
EditarEditing Revisión ortográficaSpell Checking

RichTextBoxRichTextBox

Compatibilidad con texto sin formato y portapapeles de entrada de lápizPlaintext and Ink Clipboard Support

Pegado iniciado por el usuarioUser-Initiated Paste

Copiar contenido seleccionadoCopying Selected Content
ControlesControls Controles generalesGeneral Controls

En esta tabla se WPFWPF tratan las características de en un nivel alto.This table covers the WPFWPF features at a high level. Para obtener información más detallada, el Windows SDK documenta los permisos requeridos por cada miembro en WPFWPF.For more detailed information, the Windows SDK documents the permissions that are required by each member in WPFWPF. Además, las características siguientes ofrecen más información detallada sobre la ejecución de confianza parcial, incluidas algunas consideraciones especiales.Additionally, the following features have more detailed information regarding partial trust execution, including special considerations.

En la tabla siguiente se describen las WPFWPF características que no son seguras para ejecutarse dentro de los límites del conjunto de permisos de la zona de Internet.The following table outlines the WPFWPF features that are not safe to run within the limits of the Internet zone permission set.

Tabla 2: Características de WPF que no son seguras en confianza parcialTable 2: WPF Features that are Not Safe in Partial Trust

Área de característicasFeature Area CaracterísticaFeature
GeneralGeneral Ventana (ventanas y cuadros de diálogo definidos por la aplicación)Window (Application Defined Windows and Dialog Boxes)

SaveFileDialogSaveFileDialog

Sistema de archivosFile System

Acceso al RegistroRegistry Access

Arrastrar y colocarDrag and Drop

Serialización XAML (mediante XamlWriter.Save)XAML Serialization (via XamlWriter.Save)

Clientes de UIAutomationUIAutomation Clients

Acceso a la ventana de origen (HwndHost)Source Window Access (HwndHost)

Compatibilidad total con VozFull Speech Support

Interoperabilidad de Windows FormsWindows Forms Interoperability
Objetos visualesVisuals Efectos de imagenBitmap Effects

Codificación de imagenImage Encoding
EditarEditing Portapapeles con formato de texto enriquecidoRich Text Format Clipboard

Compatibilidad total con XAMLFull XAML support

Programación de confianza parcialPartial Trust Programming

En XBAPXBAP el caso de las aplicaciones, el código que supera el conjunto de permisos predeterminado tendrá un comportamiento diferente en función de la zona de seguridad.For XBAPXBAP applications, code that exceeds the default permission set will have different behavior depending on the security zone. En algunos casos, el usuario recibirá una advertencia al intentar instalarla.In some cases, the user will receive a warning when they attempt to install it. El usuario puede elegir continuar o cancelar la instalación.The user can choose to continue or cancel the installation. En la tabla siguiente se describe el comportamiento de la aplicación para cada zona de seguridad y qué se debe hacer para que la aplicación reciba plena confianza.The following table describes the behavior of the application for each security zone and what you have to do for the application to receive full trust.

Zona de seguridadSecurity Zone ComportamientoBehavior Obtener plena confianzaGetting Full Trust
Equipo localLocal computer Plena confianza automáticaAutomatic full trust No es necesario realizar ninguna acción.No action is needed.
Intranet y sitios de confianzaIntranet and trusted sites Pedir plena confianzaPrompt for full trust Firme la aplicación XBAP con un certificado para que el usuario vea el origen en la petición.Sign the XBAP with a certificate so that the user sees the source in the prompt.
InternetInternet Error: "Confianza no concedida"Fails with "Trust Not Granted" Firme XBAP con un certificado.Sign the XBAP with a certificate.

Nota

El comportamiento descrito en la tabla anterior es para XBAP de plena confianza que no siguen el modelo de implementación de confianza ClickOnce.The behavior described in the previous table is for full trust XBAPs that do not follow the ClickOnce Trusted Deployment model.

En general, el código que puede superar los permisos permitidos es probable que sea código común compartido entre aplicaciones independientes y hospedadas en explorador.In general, code that may exceed the allowed permissions is likely to be common code that is shared between both standalone and browser-hosted applications. CAS y WPFWPF ofrecen varias técnicas para administrar este escenario.CAS and WPFWPF offer several techniques for managing this scenario.

Detectar permisos con CASDetecting Permissions Using CAS

En algunas situaciones, es posible que las aplicaciones independientes y XBAPsXBAPsutilicen el código compartido de los ensamblados de biblioteca.In some situations, it is possible for shared code in library assemblies to be used by both standalone applications and XBAPsXBAPs. En estos casos, es posible que el código ejecute funcionalidades que podrían necesitar más permisos que los que se incluyen en el conjunto de permisos que concede la aplicación.In these cases, code may execute functionality that could require more permissions than the application's awarded permission set allows. La aplicación puede detectar si tiene un permiso determinado mediante Microsoft .NET seguridad del marco de trabajo.Your application can detect whether or not it has a certain permission by using Microsoft .NET Framework security. En concreto, puede probar si tiene un permiso específico llamando al Demand método en la instancia del permiso deseado.Specifically, it can test whether it has a specific permission by calling the Demand method on the instance of the desired permission. Esto se muestra en el ejemplo siguiente, que contiene código que consulta si tiene la capacidad de guardar un archivo en el disco local: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:

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

Si una aplicación no tiene el permiso deseado, la llamada a Demand producirá una excepción de seguridad.If an application does not have the desired permission, the call to Demand will throw a security exception. De lo contrario, se concedió el permiso.Otherwise, the permission has been granted. IsPermissionGrantedencapsula este comportamiento y devuelve true o false , según corresponda.IsPermissionGranted encapsulates this behavior and returns true or false as appropriate.

Degradación correcta de la funcionalidadGraceful Degradation of Functionality

Poder detectar si el código tiene permiso para lo que necesita hacer es interesante para código que se puede ejecutar desde distintas zonas.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. Detectar la zona es una cosa, pero es mucho mejor proporcionar una alternativa para el usuario, si es posible.While detecting the zone is one thing, it is far better to provide an alternative for the user, if possible. Por ejemplo, una aplicación de plena confianza normalmente permite a los usuarios crear archivos donde quieran, mientras que una aplicación de confianza parcial solo permite crear archivos en almacenamiento aislado.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. Si el código para crear un archivo existe en un ensamblado que comparten aplicaciones (independientes) de plena confianza y aplicaciones (hospedadas en explorador) de confianza parcial, y ambas aplicaciones quieren que los usuarios puedan crear archivos, el código compartido debe detectar si se ejecuta con confianza plena o parcial antes de crear el archivo en la ubicación adecuada.If the code to create a file exists in an assembly that is shared by both full trust (standalone) applications and partial trust (browser-hosted) applications, and both applications want users to be able to create files, the shared code should detect whether it is running in partial or full trust before creating a file in the appropriate location. En el código siguiente se muestran ambas opciones.The following code demonstrates both.

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

En muchos casos, debería poder encontrar una alternativa de confianza parcial.In many cases, you should be able to find a partial trust alternative.

En un entorno controlado, como una intranet, los marcos administrados personalizados se pueden instalar en la base de cliente en la caché de ensamblados global (GAC).In a controlled environment, such as an intranet, custom managed frameworks can be installed across the client base into the global assembly cache (GAC). Estas bibliotecas pueden ejecutar código que requiere plena confianza y se puede hacer referencia a ellas desde aplicaciones a las que solo se permite AllowPartiallyTrustedCallersAttribute la confianza parcial mediante el uso de (para obtener más información, vea seguridad y estrategia de seguridad de WPF: seguridad de plataforma).These libraries can execute code that requires full trust, and be referenced from applications that are only allowed partial trust by using AllowPartiallyTrustedCallersAttribute (for more information, see Security and WPF Security Strategy - Platform Security).

Detección de host del exploradorBrowser Host Detection

El uso de entidades de certificación para comprobar los permisos es una técnica adecuada cuando se necesita comprobar por cada permiso.Using CAS to check for permissions is a suitable technique when you need to check on a per-permission basis. Sin embargo, esta técnica depende de la detección de excepciones como parte del procesamiento normal, que, en general, no se recomienda y puede tener problemas de rendimiento.Although, this technique depends on catching exceptions as a part of normal processing, which is not recommended in general and can have performance issues. En su lugar, si Aplicación del explorador XAML (XBAP)XAML browser application (XBAP) solo se ejecuta en el espacio aislado de zona de Internet, BrowserInteropHelper.IsBrowserHosted puede usar la propiedad, que Aplicaciones del explorador XAML (XBAPs)XAML browser applications (XBAPs)devuelve true para.Instead, if your Aplicación del explorador XAML (XBAP)XAML browser application (XBAP) only runs within the Internet zone sandbox, you can use the BrowserInteropHelper.IsBrowserHosted property, which returns true for Aplicaciones del explorador XAML (XBAPs)XAML browser applications (XBAPs).

Nota

IsBrowserHostedsolo distingue si una aplicación se ejecuta en un explorador, no el conjunto de permisos con el que se ejecuta una aplicación.IsBrowserHosted only distinguishes whether an application is running in a browser, not which set of permissions an application is running with.

Gestión de permisosManaging Permissions

De forma predeterminada XBAPsXBAPs , se ejecuta con confianza parcial (conjunto de permisos predeterminados de la zona de Internet).By default, XBAPsXBAPs run with partial trust (default Internet zone permission set). Sin embargo, según los requisitos de la aplicación, es posible cambiar el conjunto de permisos predeterminado.However, depending on the requirements of the application, it is possible to change the set of permissions from the default. Por ejemplo, si se XBAPsXBAPs inicia un desde una Intranet local, puede aprovechar un conjunto de permisos mejorado, que se muestra en la tabla siguiente.For example, if an XBAPsXBAPs is launched from a local intranet, it can take advantage of an increased permission set, which is shown in the following table.

Tabla 3: Permisos de intranet y de InternetTable 3: LocalIntranet and Internet Permissions

PermisoPermission AtributoAttribute LocalIntranetLocalIntranet InternetInternet
DNSDNS Servidores DNS de accesoAccess DNS servers Yes SinNo
Variables de entornoEnvironment Variables LecturaRead Yes SinNo
Cuadros de diálogo de archivoFile Dialogs AbrirOpen Yes Yes
Cuadros de diálogo de archivoFile Dialogs Sin restricciónUnrestricted Yes SinNo
Almacenamiento aisladoIsolated Storage Aislamiento de ensamblados por el usuarioAssembly isolation by user Yes SinNo
Almacenamiento aisladoIsolated Storage Aislamiento desconocidoUnknown isolation Yes Yes
Almacenamiento aisladoIsolated Storage Cuota de usuario ilimitadaUnlimited user quota Yes SinNo
MultimediaMedia Imágenes, vídeo y audio segurosSafe audio, video, and images Yes Yes
ImpresiónPrinting Impresión predeterminadaDefault printing Yes SinNo
ImpresiónPrinting Impresión seguraSafe printing Yes Yes
ReflexiónReflection EmitirEmit Yes SinNo
SeguridadSecurity Ejecución de código administradoManaged code execution Yes Yes
SeguridadSecurity Permisos de aserción concedidosAssert granted permissions Yes SinNo
Interfaz de usuarioUser Interface Sin restricciónUnrestricted Yes SinNo
Interfaz de usuarioUser Interface Ventanas seguras de nivel superiorSafe top level windows Yes Yes
Interfaz de usuarioUser Interface Portapapeles propioOwn Clipboard Yes Yes
Explorador webWeb Browser Navegación de marcos segura a HTMLSafe frame navigation to HTML Yes Yes

Nota

Cortar y pegar solo se permite con confianza parcial cuando el usuario inicia la acción.Cut and Paste is only allowed in partial trust when user initiated.

Si necesita aumentar los permisos, debe cambiar la configuración del proyecto y el manifiesto de aplicación ClickOnce.If you need to increase permissions, you need to change the project settings and the ClickOnce application manifest. Para obtener más información, vea Información general sobre las aplicaciones de explorador XAML de WPF.For more information, see WPF XAML Browser Applications Overview. Los siguientes documentos también pueden ser útiles.The following documents may also be helpful.

XBAPXBAP Si requiere plena confianza, puede utilizar las mismas herramientas para aumentar los permisos solicitados.If your XBAPXBAP requires full trust, you can use the same tools to increase the requested permissions. Aunque un XBAPXBAP solo recibirá plena confianza si se instala y se inicia desde el equipo local, la intranet o desde una dirección URL que se muestra en sitios de confianza o permitidos del explorador.Although an XBAPXBAP will only receive full trust if it is installed on and launched from the local computer, the intranet, or from a URL that is listed in the browser's trusted or allowed sites. Si la aplicación se instala desde la intranet o un sitio de confianza, el usuario recibirá el mensaje estándar de ClickOnce, que le notificará los permisos elevados.If the application is installed from the intranet or a trusted site, the user will receive the standard ClickOnce prompt notifying them of the elevated permissions. El usuario puede elegir continuar con la instalación o cancelarla.The user can choose to continue or cancel the installation.

Como alternativa, puede usar el modelo de implementación de confianza de ClickOnce para realizar una implementación de plena confianza desde cualquier zona de seguridad.Alternatively, you can use the ClickOnce Trusted Deployment model for full trust deployment from any security zone. Para obtener más información, consulte Introducción a la implementación de aplicaciones de confianza y seguridad.For more information, see Trusted Application Deployment Overview and Security.

Vea tambiénSee also