Idioma: HTML | XAML

Cómo proteger archivos con la eliminación selectiva (XAML)

Puedes usar la eliminación selectiva para identificar los archivos protegidos en tu aplicación que pueden revocarse cuando un usuario de la aplicación ya no está autorizado para acceder a los datos de tu aplicación. Este escenario es habitual en empresas que permiten a sus empleados llevarse sus propios dispositivos al trabajo. Cuando el empleado abandona la empresa, se pueden quitar los archivos de la empresa almacenados en su dispositivo personal.

Por ejemplo, un empleado se lleva su tableta personal a la oficina y la usa para el correo electrónico de la empresa. La aplicación de correo electrónico puede usar la eliminación selectiva para proteger todos los archivos que se usan para almacenar localmente en el equipo los correos electrónicos de la empresa. Para llevarlo a cabo, se asocian esos archivos a la empresa mediante un identificador de empresa, como "sample.com". Si el usuario ya no trabaja para la empresa, la próxima vez que abra la aplicación de correo electrónico de la empresa, la aplicación puede determinar que el usuario ya no es un empleado e indicar a la eliminación selectiva que revoque el acceso a todos los archivos protegidos para su identificador de empresa. Cuando la aplicación intenta acceder a un archivo y determina que se ha revocado, la aplicación puede eliminar el archivo.

Requisitos previos

  • En el código de ejemplo de este tema se supone que se han establecido las siguientes variables globales.
    
    ApplicationData appRootFolder = ApplicationData.Current;
    string enterpriseIdentity = "example.com";
    int AccessDeniedHResult = -2147024891;  // Access Denied (0x80070005)
    
    
    

Proteger un archivo o carpeta mediante la eliminación selectiva

Puedes usar el método ProtectAsync para proteger un archivo o carpeta mediante la eliminación selectiva. El archivo se identifica como protegido para tu identificador de empresa (por ejemplo, "example.com"), como se muestra en el código de ejemplo anterior. Si proteges una carpeta con el método ProtectAsync, todos los archivos de esa carpeta heredan la misma protección.


// Add a folder and protect it using Selective Wipe.
private async Task<StorageFolder> AddFolder(string folderName)
{
    StorageFolder newFolder = await appRootFolder.LocalFolder.CreateFolderAsync(folderName);

    var status = await ProtectItem(newFolder, enterpriseIdentity);

    return newFolder;
}

// Add a file and protect it using Selective Wipe.
private async Task<StorageFile> AddFile(string fileName, StorageFolder folder)
{
    StorageFile newFile = await folder.CreateFileAsync(fileName);

    var status = 
        await Windows.Security.EnterpriseData.FileRevocationManager.
            GetStatusAsync(newFile);

    if (status != Windows.Security.EnterpriseData.FileProtectionStatus.Protected)
    {
        status = await ProtectItem(newFile, enterpriseIdentity);
    }

    return newFile;
}

private async Task<Windows.Security.EnterpriseData.FileProtectionStatus> 
    ProtectItem(IStorageItem item, string enterpriseIdentity)
{
    var status = 
        await Windows.Security.EnterpriseData.FileRevocationManager.
            ProtectAsync(item, enterpriseIdentity);

    return status;
}


Revocar el acceso a carpetas y archivos protegidos

Cuando tu aplicación determina que un usuario ya no es válido, puedes revocar rápidamente el acceso a todos los archivos y carpetas protegidos para un identificador de empresa mediante el método Revoke, como se muestra en el siguiente ejemplo. El archivo no se elimina mediante el método Revoke. El método Revoke coloca el archivo en un estado inaccesible. Puedes agregar código a tu aplicación para eliminar un archivo que sea inaccesible y que se haya revocado, como se muestra en el siguiente ejemplo.


private void InitializeApp(string userName)
{
    if (GetUserStatus(userName) == AppUserStatus.NotFound)
    {
        Windows.Security.EnterpriseData.FileRevocationManager.Revoke(enterpriseIdentity);
    }
}


Obtener el estado de un archivo

Puedes usar el método GetStatusAsync para determinar el estado de protección de la eliminación selectiva de un archivo o carpeta. Te indicará si un archivo está protegido o no, si está protegido por otro usuario en el equipo, etc. Un uso habitual del método GetStatusAsync es determinar cuándo debe eliminarse un archivo protegido. Por ejemplo, cuando se revoca un archivo protegido, al intentar acceder al contenido del archivo, se generará una excepción "Acceso denegado". Si encuentras esta excepción, puedes usar el método GetStatusAsync para determinar si el archivo se ha revocado mediante la eliminación selectiva y, a continuación, eliminar el archivo (en caso de tenerlo), como se muestra en el siguiente ejemplo.


private async Task<IRandomAccessStream> GetFileContents(string filePath)
{
    IRandomAccessStream stream = null;
    StorageFile file = null;

    try
    {
        file = await StorageFile.GetFileFromPathAsync(filePath);
        stream = await file.OpenReadAsync();
    }
    catch (UnauthorizedAccessException e)
    {
        if (e.HResult == AccessDeniedHResult)
        {
            // Delete file if it has been revoked.
            SelectiveWipeCleanup(file);
        }

        return null;
    }

    return stream;
}

// Delete items revoked by Selective Wipe.
private async void SelectiveWipeCleanup(StorageFile file)
{
    var status = await Windows.Security.EnterpriseData.FileRevocationManager.GetStatusAsync(file);
    if (status == Windows.Security.EnterpriseData.FileProtectionStatus.Revoked)
    {
        await file.DeleteAsync();
    }
}


Copiar un archivo protegido

Cuando copias un archivo mediante los métodos CopyAsync o CopyAndReplaceAsync, la protección de eliminación selectiva del archivo copiado no se aplica automáticamente a la nueva copia del archivo. Esto afecta a los archivos que se guardan como un archivo nuevo mediante "Guardar como". En ese caso, puedes copiar la protección de eliminación selectiva del archivo original mediante el método CopyProtectionAsync, como se muestra en el siguiente ejemplo.


public async Task<bool> CopyFile(StorageFile file, StorageFolder newFolder) 
{
    bool result = false;

    try
    {
        var newFile = await file.CopyAsync(newFolder);
        result = await 
            Windows.Security.EnterpriseData.FileRevocationManager.
            CopyProtectionAsync(file, newFile);
        }
    catch (Exception e) 
    {
        // Handle exception. For example, copy already exists.
    }

    return result;
}


Ejemplo completo

Temas relacionados

Muestra de FileRevocationManager
Windows.Security.EnterpriseData namespace
Proteger aplicaciones

 

 

Mostrar:
© 2015 Microsoft