我已经阅读了文档,搜索了互联网,看来我想要做的就是在没有编写自定义CAS权限的情况下无法完成。所以,这是我最后的尝试。
我想DECLARATIVY在我的类上定义一个FileIOPermission(Attribute)以要求用户MyDocuments目录的权限。 此目录在所有操作系统上都不一致,通常通过Path.GetFolderPath(我认为是这样)在.net中访问,传递一个SpecialFolder枚举值。 FileIOPermissionAttribute中是否有任何“令牌”语法或类似功能可以对运行时说 - “允许我访问此SpecialFolder,无论它在此系统上的哪个位置”?
如果不是,我想我将不得不编写一个自定义的Permission对象,它基本上就是......
谢谢!
答案 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中实现特殊文件夹支持的原因之一。)