lunes, 20 de julio de 2015

Receta C# No. 5-18: Cómo Usar Almacenamiento Aislado

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Generalidades
3.2 Políticas de seguridad de la CLR
3.3 Clase IsolatedStorageFile
3.4 Clase IsolatedStorageFileStream
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Receta C# número 18. En esta receta C# aprenderemos a usar el mecanismo de almacenamiento aislado para crear archivos de trabajo, ya sea de aplicación o de usuario, en la ubicación del perfil de usuario. Esto como ya veremos es útil debido a restricciones de acceso/escritura sobre medios de almacenamiento impuestas por las políticas de FileIOPermission. Para ello tendremos que usar dos clases especializadas en almacenamiento aislado: IsolatedStorageFile, y IsolatedStorageFileStrea. ¡Manos a la obra!

1. Problema

Nuestra aplicación requiere crear archivos extra para almacenamiento de datos de usuario y de aplicación, sin embargo las políticas de acceso impuestas por FileIOPermission restringen el acceso a la unidad de disco duro local.

2. Solución

El namespace System.IO.IsolatedStorage contiene las clases IsolatedStorageFile y IsolatedStorageFileStream. Con estas clases podemos pasar por alto los requerimientos de seguridad impuestos por FileIOPermission, y en consecuencia, poder escribir en el directorio del perfil de usuario.

3. Discusión de la Solución

3.1 Generalidades

Entre las características que soporta .NET Framework está la de permitir a una aplicación de confianza acceder a almacenamiento aislado. Esto quiere decir que desde una aplicación podemos escribir y leer datos en un sistema de archivos virtual que la Common Language Runtime (CLR) gestiona. Cuando una aplicación requiere trabajar con archivos adicionales externamente para escribir datos de aplicación o de usuario, con este sistema de archivos virtual podemos crear archivos en el directorio del perfil de usuario; i.e.:
  • Windows XPC:\Documents and Settings\[Usuario]\Local Settings\Application Data\isolated storage
  • Windows 7 (o superior): C:\Users\Usuario\AppData\Local\IsolatedStorage
Continuando, una de las razones que justifica el uso de almacenamiento es [1]
"One reason you might use isolated storage is to give a partially trusted application limited ability to store data."
Además: 
"Another reason you might use an isolated store is to better secure data. For example, data in one user's isolated store will restricted from another nonadministrative user."

3.2 Políticas de Seguridad de la CLR

De manera predeterminada, la CLR permite a aplicaciones locales acceder a cualquier archivo, debido a que no tiene impuestas políticas de seguridad por FileIOPermission [2].

Esta última clase está diseñada para establecer políticas de acceso a archivos y directorios. Por ejemplo:

FileIOPermission f = new FileIOPermission(PermissionState.None);
f.AllLocalFiles = FileIOPermissionAccess.Read;

try
{
f.Demand();
}
catch(SecurityException s)
{
Console.WriteLine(s.Message);
}

En las primeras dos líneas se especifican los niveles de permisos, que en esta caso corresponden con el acceso de sólo lectura a todos los archivos de las unidades de disco configuradas en el sistema operacional.

Por otra parte, las aplicaciones que se ejecutan desde un servidor remoto de manera automática la CLR les asigna menos permisos de acceso y lectura a las unidades de disco locales; sin embargo, es posible acceder a almacenamiento aislado gracias a IsolatedStoragePermission [3]. Es importante considerar [1]:
"The security policy also limits the maximum amount of space that can be used in an isolated store."

3.3 Clase IsolatedStorageFile

La clase IsolatedStorageFile [4] representa un área de almacenamiento aislada para contener archivos y directorios.

Entre las funcionalidades sobresalientes tenemos [4]:
  • las aplicaciones pueden usar el almacenamiento aislado para crear archivos y carpetas sin necesidad de especificar ninguna ruta específica en el sistema de archivos.
  • no es posible que otras aplicaciones de código administrado accedan a este almacenamiento aislado, debido a que el almacenamiento corresponde a un ámbito de assembly específico.
Ejemplo de uso:

En la línea 14 creamos un objeto IsolatedStorageFile para la obtención de almacenamiento aislado para la aplicación y assembly actuales. En las líneas 17-24:
  • Línea 18: Creamos un directorio en la raíz llamado DirectorioSuperior con el método CreateDirectory.
  • Línea 19: Dentro del directorio recién creado, añadimos un subdirectorio llamado Subdirectorio.
  • Línea 23: Creamos un archivo llamado ArchivoTexto.txt con el método CreateFile.
Compilación:

  1. csc /target:exe UsoIsolatedStorageFile.cs

Ejecución assembly:

  1. .\UsoIsolatedStorageFile.exe

> Prueba de ejecución:
Ejecución assembly UsoIsolatedStorageFile.exe
Figura 1. Ejecución assembly UsoIsolatedStorageFile.exe.

Después de haberse ejecutado este assembly buscamos por los archivos y directorios creados en el directorio de almacenamiento aislado:
Resultado ejecución assembly UsoIsolatedStorageFile.exe
Figura 2. Resultado ejecución assembly UsoIsolatedStorageFile.exe.

3.4 Clase IsolatedStorageFileStream

La clase IsolatedStorageFileStream [5] está diseñada para la permitir la escritura, lectura, creación de archivos en almacenamiento aislado.

(Nota: En la siguiente sección usaremos esta clase para demostrar sus capacidades de escritura en almacenamiento aislado.)

4. Práctica: Código C#

Demostración de acceso a una locación de almacenamiento aislado en C#:

En la línea 16 creamos un objeto IsolatedStorageFile a partir de la invocación de GetUserStoreForAssembly para la obtención de almacenamiento aislado de ámbito local para el assembly actual. Creamos un directorio en la raíz del almacenamiento aislado con CreateDirectory: línea 19.


Más adelante, línea 22, creamos un objeto Stream para la escritura de datos sobre el archivo Resportes.txt. Apartir del objeto anterior instanciamos un objeto tipo StreamWriter para escribir datos sobre el archivo en cuestión.

Después: 
  • Línea 32: Muestra el tamaño en bytes del espacio utilizado por el almacenamiento aislado: almacenamiento.UsedSize.
  • Línea 33: Mostramos el ámbito del almacenamiento aislado: almacenamiento.Scope.
  • Línea 38: Obtenemos arreglo de objetos String con los nombres de archivos contenidos en el almacenamiento aislado: almacenamiento.GetFileNames("*.*").
Compilación:


  1. csc /target:exe AlmacenamientoAislado.cs

Ejecución assembly:

\AlmacenamientoAislado.exe

> Prueba de ejecución:
Ejecución assembly AlmacenamientoAislado.exe
Figura 2. Ejecución assembly AlmacenamientoAislado.exe.

5. Conclusiones

Aprendimos que es posible asignar almacenamiento aislado (isolated store) para aquellas aplicaciones que poseen restricciones de acceso para escritura y lectura en los sistemas de archivos locales. Vimos que este tipo de solución es práctico para aplicaciones de confianza que requieren escribir datos. También notamos que el almacenamiento es gestionado por la CLR en un sistema de archivos virtual.


En la siguiente receta C# aprenderemos a monitorizar cambios en el sistema de archivos.

6. Glosario

  • Aplicación
  • Archivo
  • CLR
  • Directorio
  • Política de seguridad
  • Restricción
  • Servidor remoto

7. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: FileIOPermission Class (System.Security.Permissions) - https://msdn.microsoft.com/en-us/library/system.security.permissions.fileiopermission(v=vs.110).aspx
[3]: IsolatedStoragePermission Class (System.Security.Permissions) - https://msdn.microsoft.com/en-us/library/system.security.permissions.isolatedstoragepermission(v=vs.110).aspx
[4]: IsolatedStorageFile Class (System.IO.IsolatedStorage) - https://msdn.microsoft.com/en-us/library/system.io.isolatedstorage.isolatedstoragefile(v=vs.110).aspx
[5]: IsolatedStorageFileStream Class (System.IO.IsolatedStorage) - https://msdn.microsoft.com/en-us/library/system.io.isolatedstorage.isolatedstoragefilestream(v=vs.110).aspx


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.