Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
XAML (consulta XAML en WPF).
Ventanas emergentes (ver System.Windows.Controls.Primitives.Popup).
Arrastrar y colocar (consulte Información general sobre arrastrar y colocar).
Portapapeles (consulte System.Windows.Clipboard).
Imágenes (vea System.Windows.Controls.Image).
Serialización (vea XamlReader.Load, XamlWriter.Save).
Abrir archivo (cuadro de diálogo) (vea Microsoft.Win32.OpenFileDialog).
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 | Sí | No |
Variables de entorno | Lectura | Sí | No |
Cuadros de diálogo de archivo | Abierto | Sí | Sí |
Cuadros de diálogo de archivo | Sin restricciones | Sí | No |
Almacenamiento aislado | Aislamiento de ensamblajes por usuario | Sí | No |
Almacenamiento aislado | Aislamiento desconocido | Sí | Sí |
Almacenamiento aislado | Cuota de usuario ilimitada | Sí | No |
Medios de comunicación | Audio, vídeo e imágenes seguros | Sí | Sí |
Impresión | Impresión predeterminada | Sí | No |
Impresión | Impresión segura | Sí | Sí |
Reflexión | Emitir | Sí | No |
Seguridad | Ejecución de código administrado | Sí | Sí |
Seguridad | Verificar permisos concedidos | Sí | No |
Interfaz de usuario | Sin restricciones | Sí | No |
Interfaz de usuario | Ventanas de nivel superior seguras | Sí | Sí |
Interfaz de usuario | Portapapeles personal | Sí | Sí |
Navegador web | Navegación segura de marcos a HTML | Sí | Sí |
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.
Mage.exe (Herramienta de generación y edición de manifiestos).
MageUI.exe (Herramienta de generación y edición de manifiestos, cliente gráfico).
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
.NET Desktop feedback