【问题标题】:Declaring FileIOPermission on special folders在特殊文件夹上声明 FileIOPermission
【发布时间】:2009-09-17 09:22:08
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: .net permissions code-access-security


    【解决方案1】:

    您实际上并不需要自定义权限,但您确实需要一个类似于 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 中实现特殊文件夹支持的原因之一。)

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多