Question

J'ai lu la documentation, parcouru les pages Web, et il semble que ce que je veux faire ne puisse être fait sans avoir écrit une autorisation CAS personnalisée. Alors, voici ma dernière tentative.

Je souhaite définir de manière catégorique un FileIOPermission (attribut) sur ma classe afin de demander l'autorisation d'accéder au répertoire MyDocuments de l'utilisateur. Ce répertoire n’est pas cohérent sur tous les systèmes d’exploitation et est généralement accessible en .net via Path.GetFolderPath (je pense que c’est ça), en passant une valeur d’énumération SpecialFolder. Existe-t-il une syntaxe "token" ou une fonctionnalité similaire dans FileIOPermissionAttribute pour dire au runtime: "donnez-moi l'accès à ce dossier spécial, où qu'il se trouve sur ce système"?

Sinon, je suppose que je devrai écrire un objet Permission personnalisé qui fait essentiellement cela ...

Merci!

Était-ce utile?

La solution

Vous n'avez pas réellement besoin d'une autorisation personnalisée pour cela, mais vous avez besoin d'un attribut personnalisé qui ressemble à FileIOPermissionAttribute. Dans sa méthode CreatePermission, vous pouvez créer un FileIOPermission pour le chemin de dossier actuel correspondant à la valeur de SpecialFolder transmise à l'attribut. par exemple. (nécessite une validation supplémentaire):

[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;
    }
}

Une chose à surveiller ici est que Environment.GetFolderPath demandera un accès PathDiscovery sur le dossier cible. Vous devrez donc décider si vous souhaitez affirmer cette autorisation dans votre méthode CreatePermission. (Personnellement, je soupçonne que les complications liées à cette situation sont peut-être l’une des raisons pour lesquelles l’équipe de la BCL n’a pas mis en place un support spécial pour les dossiers dans FileIOPermissionAttribute.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top