1

我已经阅读了文档,搜索了互联网,如果不编写自定义 CAS 权限,我似乎无法完成我想做的事情。所以,这是我最后一次尝试。

我想在我的类上声明定义一个 FileIOPermission(属性),以要求对用户 MyDocuments 目录的权限。这个目录在所有操作系统上并不一致,一般在 .net 中通过 Path.GetFolderPath 访问(我想就是这样),传递一个 SpecialFolder 枚举值。FileIOPermissionAttribute 中是否有任何“令牌”语法或类似功能可以对运行时说 - “让我访问这个 SpecialFolder,无论它在这个系统上的什么地方”?

如果不是,我想我将不得不编写一个自定义的 Permission 对象,它基本上可以做到这一点......

谢谢!

4

1 回答 1

2

您实际上不需要为此自定义权限,但您确实需要类似于 FileIOPermissionAttribute 的自定义属性。在其 CreatePermission 方法中,您可以为传递给属性的 SpecialFolder 值对应的实际文件夹路径创建 FileIOPermission。例如(需要添加一些验证):

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

这里要注意的一件事是 Environment.GetFolderPath 将要求对目标文件夹进行 PathDiscovery 访问,因此您必须决定是否要在 CreatePermission 方法中声明该权限。(就个人而言,我怀疑这方面的复杂性可能是 BCL 团队一开始没有在 FileIOPermissionAttribute 中实现特殊文件夹支持的原因之一。)

于 2009-09-18T12:55:11.320 回答