Compartir a través de


Seguridad de confianza parcial de WPF

En general, las aplicaciones de Internet deben restringirse a tener acceso directo a los recursos críticos del sistema, para evitar daños malintencionados. De forma predeterminada, los lenguajes de scripting html y del lado cliente no pueden acceder a los recursos críticos del sistema. Dado que las aplicaciones hospedadas en explorador de Windows Presentation Foundation (WPF) se pueden iniciar desde el explorador, deben ajustarse a un conjunto similar de restricciones. Para aplicar estas restricciones, WPF se basa tanto en la seguridad de acceso al código (CAS) como en ClickOnce (consulte Estrategia de seguridad de WPF : seguridad de la plataforma). De forma predeterminada, las aplicaciones hospedadas en el explorador solicitan el conjunto de permisos CAS de la zona de Internet, independientemente de si se inician desde Internet, la intranet local o el equipo local. Se dice que las aplicaciones que se ejecutan con cualquier cosa menor que el conjunto completo de permisos se ejecutan con confianza parcial.

Advertencia

Los XBAP requieren que los exploradores heredados funcionen, como Internet Explorer y versiones anteriores de Firefox. Normalmente, estos exploradores más antiguos no son compatibles con Windows 10 y Windows 11. Los exploradores modernos ya no admiten la tecnología necesaria para las aplicaciones XBAP debido a riesgos de seguridad. Los complementos que habilitan XBAPs ya no se admiten. Para obtener más información, vea Preguntas más frecuentes sobre las aplicaciones hospedadas por el explorador (XBAP) de WPF.

WPF proporciona una amplia variedad de compatibilidad para garantizar que la mayor cantidad de funcionalidad posible se pueda usar de forma segura en confianza parcial y, junto con CAS, proporciona compatibilidad adicional para la programación de confianza parcial.

Este tema contiene las secciones siguientes:

Compatibilidad de características WPF con confianza parcial

Advertencia

La seguridad de acceso al código (CAS) no es compatible con .NET moderno, es un concepto de solo .NET Framework. Todas las funcionalidades relacionadas con CAS se tratan bajo la suposición de plena confianza. Para obtener más información, vea Diferencias con WPF .NET - Seguridad de acceso al código.

En la tabla siguiente se enumeran las características de alto nivel de Windows Presentation Foundation (WPF) que son seguras de usar dentro de los límites del conjunto de permisos de zona de Internet.

Tabla 1: Características de WPF seguras en confianza parcial

Área de funcionalidad Característica
General Ventana del explorador

Acceso al sitio de origen

IsolatedStorage (límite de 512 KB)

Proveedores de UIAutomation

Autoritario

Editores de métodos de entrada (IME)

Stylus y tinta para tabletas

Arrastrar y colocar simulado mediante eventos de captura y movimiento del mouse

OpenFileDialog

Deserialización XAML (a través de XamlReader.Load)
Integración web Cuadro de diálogo de descarga del navegador

Top-Level User-Initiated Navegación

mailto:links

Parámetros uniformes del identificador de recursos

HTTPWebRequest

Contenido WPF hospedado en un IFRAME

Hospedaje de páginas HTML de Same-Site mediante Frame

Hospedaje de páginas HTML del mismo sitio mediante WebBrowser

Servicios web (ASMX)

Servicios web (con Windows Communication Foundation)

Escritura de scripts

Modelo de objetos de documento
Elementos visuales 2D y 3D

Animación

Medios (sitio de origen y entre dominios)

Imágenes, audio y vídeo
Lectura FlowDocuments

Documentos XPS

Fuentes incrustadas y de sistema

Fuentes CFF y TrueType
Corrección Revisión ortográfica

RichTextBox

Compatibilidad con el Portapapeles de texto sin formato y tinta

User-Initiated Pegar

Copiar contenido seleccionado
Controles Controles generales

En esta tabla se describen las características de WPF de alto nivel. Para obtener información más detallada, Windows SDK documenta los permisos necesarios para cada miembro de WPF. Además, las siguientes características proporcionan información más detallada acerca de la ejecución parcial de confianza, incluidas consideraciones especiales.

En la tabla siguiente se describen las características de WPF que no son seguras para ejecutarse dentro de los límites del conjunto de permisos de zona de Internet.

Tabla 2: Características de WPF que no son seguras en confianza parcial

Área de funcionalidad Característica
General Ventana (Ventana definida por la aplicación y cuadros de diálogo)

Cuadro de diálogo para guardar archivos

Sistema de archivos

Acceso al Registro

Arrastrar y colocar

Serialización XAML (a través de XamlWriter.Save)

Clientes UIAutomation

Acceso a la ventana de origen (HwndHost)

Compatibilidad completa con voz

Interoperabilidad de Windows Forms
Elementos visuales Efectos de mapa de bits

Codificación de imágenes
Corrección Portapapeles de formato de texto enriquecido

Compatibilidad completa con XAML

Programación de confianza parcial

En el caso de las aplicaciones XBAP, el código que supera el conjunto de permisos predeterminado tendrá un comportamiento diferente en función de la zona de seguridad. En algunos casos, el usuario recibirá una advertencia cuando intente instalarlo. El usuario puede optar por continuar o cancelar la instalación. En la tabla siguiente se describe el comportamiento de la aplicación para cada zona de seguridad y lo que debe hacer para que la aplicación reciba plena confianza.

Advertencia

Los XBAP requieren que los exploradores heredados funcionen, como Internet Explorer y versiones anteriores de Firefox. Normalmente, estos exploradores más antiguos no son compatibles con Windows 10 y Windows 11. Los exploradores modernos ya no admiten la tecnología necesaria para las aplicaciones XBAP debido a riesgos de seguridad. Los complementos que habilitan XBAPs ya no se admiten. Para obtener más información, vea Preguntas más frecuentes sobre las aplicaciones hospedadas por el explorador (XBAP) de WPF.

Zona de seguridad Comportamiento Obtención de plena confianza
Equipo local Plena confianza automática No se requiere ninguna acción.
Intranet y sitios de confianza Solicitar plena confianza Firme el XBAP con un certificado para que el usuario vea el origen en el cuadro de diálogo.
Internet Se produce un error con "Confianza no concedida" Firmar el XBAP con un certificado.

Nota:

El comportamiento descrito en la tabla anterior es para XBAP de plena confianza que no siguen el modelo de implementación de confianza de ClickOnce.

En general, es probable que el código que supere los permisos permitidos sea código común que se comparte entre aplicaciones independientes y hospedadas por el explorador. CAS y WPF ofrecen varias técnicas para administrar este escenario.

Detección de permisos utilizando CAS

En algunas situaciones, es posible que las aplicaciones independientes y XBAPs usen código compartido en ensamblados de biblioteca. En estos casos, el código puede ejecutar la funcionalidad que podría requerir más permisos de los que permite el conjunto de permisos concedido por la aplicación. La aplicación puede detectar si tiene o no un permiso determinado mediante la seguridad de Microsoft .NET Framework. En concreto, puede probar si tiene un permiso específico llamando al Demand método en la instancia del permiso deseado. Esto se muestra en el ejemplo siguiente, que tiene código que consulta si tiene la capacidad de guardar un archivo en el 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

Si una aplicación no tiene el permiso deseado, la llamada a Demand producirá una excepción de seguridad. En otro caso, se ha concedido el permiso. IsPermissionGranted encapsula este comportamiento y devuelve true o false según corresponda.

Degradación gradual de la funcionalidad

Poder detectar si el código tiene el permiso para hacer lo que necesita hacer es interesante para el código que se puede ejecutar desde diferentes zonas. Aunque la detección de la zona es una cosa, es mucho mejor proporcionar una alternativa para el usuario, si es posible. Por ejemplo, una aplicación de plena confianza normalmente permite a los usuarios crear archivos en cualquier lugar que quieran, mientras que una aplicación de confianza parcial solo puede crear archivos en almacenamiento aislado. Si el código para crear un archivo existe en un ensamblado compartido por aplicaciones de plena confianza (independiente) y aplicaciones de confianza parcial (hospedadas por el explorador) y ambas aplicaciones quieren que los usuarios puedan crear archivos, el código compartido debe detectar si se ejecuta en confianza parcial o plena antes de crear un archivo en la ubicación adecuada. En el código siguiente se muestran 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

En muchos casos, debería poder encontrar una opción de confianza parcial.

En un entorno controlado, como una intranet, los marcos administrados personalizados se pueden instalar en el conjunto de clientes dentro de la caché global de ensamblados (GAC). Estas bibliotecas pueden ejecutar código que requiere plena confianza y hacer referencia a ellas desde aplicaciones que solo se permiten confianza parcial mediante AllowPartiallyTrustedCallersAttribute (para obtener más información, vea Security and WPF Security Strategy - Platform Security).

Detección de host del explorador

El uso de CAS para verificar permisos es una técnica adecuada cuando se necesita comprobar de manera individual. Aunque esta técnica depende de detectar excepciones como parte del procesamiento normal, que no se recomienda en general y puede tener problemas de rendimiento. Por el contrario, si la aplicación de navegador XAML (XBAP) solo se ejecuta dentro del espacio aislado de la zona de Internet, puedes usar la propiedad BrowserInteropHelper.IsBrowserHosted, que devuelve el valor verdadero para las aplicaciones de navegador XAML (XBAP).

Advertencia

Los XBAP requieren que los exploradores heredados funcionen, como Internet Explorer y versiones anteriores de Firefox. Normalmente, estos exploradores más antiguos no son compatibles con Windows 10 y Windows 11. Los exploradores modernos ya no admiten la tecnología necesaria para las aplicaciones XBAP debido a riesgos de seguridad. Los complementos que habilitan XBAPs ya no se admiten. Para obtener más información, vea Preguntas más frecuentes sobre las aplicaciones hospedadas por el explorador (XBAP) de WPF.

Nota:

IsBrowserHosted solo distingue si una aplicación se ejecuta en un explorador, no con qué conjunto de permisos se ejecuta una aplicación.

Administrar permisos

De forma predeterminada, los XBAP se ejecutan con confianza parcial (conjunto de permisos de zona de Internet predeterminado). Sin embargo, dependiendo de los requisitos de la aplicación, es posible cambiar el conjunto de permisos del valor predeterminado. Por ejemplo, si se inicia un XBAPs desde una intranet local, puede aprovechar un conjunto de permisos aumentado, que se muestra en la tabla siguiente.

Advertencia

Los XBAP requieren que los exploradores heredados funcionen, como Internet Explorer y versiones anteriores de Firefox. Normalmente, estos exploradores más antiguos no son compatibles con Windows 10 y Windows 11. Los exploradores modernos ya no admiten la tecnología necesaria para las aplicaciones XBAP debido a riesgos de seguridad. Los complementos que habilitan XBAPs ya no se admiten. Para obtener más información, vea Preguntas más frecuentes sobre las aplicaciones hospedadas por el explorador (XBAP) de WPF.

Tabla 3: Permisos de LocalIntranet e Internet

Permiso Atributo LocalIntranet Internet
DNS (Sistema de Nombres de Dominio) Acceso a servidores DNS No
Variables de entorno Lectura No
Cuadros de diálogo de archivo Abierto
Cuadros de diálogo de archivo Sin restricciones No
Almacenamiento aislado Aislamiento de ensamblajes por usuario No
Almacenamiento aislado Aislamiento desconocido
Almacenamiento aislado Cuota de usuario ilimitada No
Medios de comunicación Audio, vídeo e imágenes seguros
Impresión Impresión predeterminada No
Impresión Impresión segura
Reflexión Emitir No
Seguridad Ejecución de código administrado
Seguridad Verificar permisos concedidos No
Interfaz de usuario Sin restricciones No
Interfaz de usuario Ventanas de nivel superior seguras
Interfaz de usuario Portapapeles personal
Navegador web Navegación segura de marcos a HTML

Nota:

Cortar y pegar solo se permite en confianza parcial cuando lo inicia el usuario.

Si necesita aumentar los permisos, debe cambiar la configuración del proyecto y el manifiesto de aplicación ClickOnce. Para obtener más información, consulta Introducción a las aplicaciones de explorador XAML de WPF. Los siguientes documentos también pueden resultar útiles.

Si XBAP requiere plena confianza, puede usar las mismas herramientas para aumentar los permisos solicitados. Aunque un XBAP solo recibirá plena confianza si está instalado y iniciado desde el equipo local, la intranet o desde una dirección URL que aparece en los sitios de confianza o permitidos del explorador. Si la aplicación se instala desde la intranet o un sitio de confianza, el usuario recibirá el mensaje ClickOnce estándar que le notificará los permisos elevados. El usuario puede optar por continuar o cancelar la instalación.

Como alternativa, puede usar el modelo de despliegue confiable ClickOnce para el despliegue de plena confianza desde cualquier zona de seguridad. Para obtener más información, consulte Información general sobre la implementación de aplicaciones de confianza y Seguridad.

Consulte también