Pregunta

He leído la documentación, revisado las interwebs, y parece que lo que quiero hacer no se puede hacer sin escribir un permiso CAS personalizado. Entonces, aquí está mi último intento de zanja.

Quiero DECLARATIVAMENTE definir un FileIOPermission (Attribute) en mi clase para exigir permiso al directorio MyDocuments de los usuarios. Este directorio no es consistente en todos los sistemas operativos, y generalmente se accede en .net a través de Path.GetFolderPath (creo que es así), pasando un valor de enumeración SpecialFolder. ¿Hay alguna sintaxis 'token' o característica similar en el FileIOPermissionAttribute para decirle al tiempo de ejecución: 'dame acceso a este SpecialFolder, donde sea que esté en este sistema'?

Si no, supongo que tendré que escribir un objeto de permiso personalizado que esencialmente hace eso ...

¡Gracias!

¿Fue útil?

Solución

En realidad no necesita un permiso personalizado para esto, pero sí necesita un atributo personalizado que se parezca a FileIOPermissionAttribute. En su método CreatePermission, puede crear una FileIOPermission para la ruta de la carpeta real correspondiente al valor de SpecialFolder pasado al atributo. p.ej. (que necesita alguna validación agregada):

[Serializable]
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Struct | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)]
public sealed class SpecialFolderIOPermissionAttribute : CodeAccessSecurityAttribute
{
    private Environment.SpecialFolder _folder;
    private FileIOPermissionAccess _access;

    public SpecialFolderIOPermissionAttribute(SecurityAction action)
        : base(action)
    {
        this.Unrestricted = true;
    }

    public Environment.SpecialFolder Folder
    {
        get
        {
            return this._folder;
        }
        set
        {
            this._folder = value;
            this.Unrestricted = false;
        }
    }

    public FileIOPermissionAccess Access
    {
        get
        {
            return this._access;
        }
        set
        {
            this._access = value;
            this.Unrestricted = false;
        }
    }

    public override IPermission CreatePermission()
    {
        FileIOPermission permission;
        if (this.Unrestricted)
        {
            permission = new FileIOPermission(PermissionState.Unrestricted);
        }
        else
        {
            permission = new FileIOPermission(this.Access, Environment.GetFolderPath(this.Folder));
        }

        return permission;
    }
}

Una cosa a tener en cuenta aquí es que Environment.GetFolderPath hará una demanda de acceso PathDiscovery en la carpeta de destino, por lo que tendrá que decidir si desea hacer valer ese permiso en su método CreatePermission. (Personalmente, sospecho que las complicaciones en torno a esto pueden ser una de las razones por las que el equipo de BCL no implementó compatibilidad con carpetas especiales en FileIOPermissionAttribute en primer lugar).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top