在特殊文件夹上声明FileIOPermission

时间:2009-09-17 09:22:08

标签: .net permissions code-access-security

我已经阅读了文档,搜索了互联网,看来我想要做的就是在没有编写自定义CAS权限的情况下无法完成。所以,这是我最后的尝试。

我想DECLARATIVY在我的类上定义一个FileIOPermission(Attribute)以要求用户MyDocuments目录的权限。 此目录在所有操作系统上都不一致,通常通过Path.GetFolderPath(我认为是这样)在.net中访问,传递一个SpecialFolder枚举值。 FileIOPermissionAttribute中是否有任何“令牌”语法或类似功能可以对运行时说 - “允许我访问此SpecialFolder,无论它在此系统上的哪个位置”?

如果不是,我想我将不得不编写一个自定义的Permission对象,它基本上就是......

谢谢!

1 个答案:

答案 0 :(得分: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中实现特殊文件夹支持的原因之一。)