【问题标题】: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 中实现特殊文件夹支持的原因之一。)