在ASP.NET incode中设置FileIOPermissions
我有一个小应用程序,可以加载插件类型的组件,其他用户可以自由上传到服务器上。但我不希望用户能够访问其他用户的文件。我需要将每个插件组件的访问设置为受限访问 我试图在插件类基类中设置访问权限,但即使这样,加载的插件类似乎也具有完全的文件访问权限 我无法使用属性设置权限,因为路径会根据加载页面的用户而变化 下面是一个代码snippest:在ASP.NET incode中设置FileIOPermissions,asp.net,file-permissions,Asp.net,File Permissions,我有一个小应用程序,可以加载插件类型的组件,其他用户可以自由上传到服务器上。但我不希望用户能够访问其他用户的文件。我需要将每个插件组件的访问设置为受限访问 我试图在插件类基类中设置访问权限,但即使这样,加载的插件类似乎也具有完全的文件访问权限 我无法使用属性设置权限,因为路径会根据加载页面的用户而变化 下面是一个代码snippest: public abstract class PluginBase<T> { public PluginBase { PermissionSet ps
public abstract class PluginBase<T>
{
public PluginBase
{
PermissionSet ps = new PermissionSet(System.Security.Permissions.PermissionState.None);
ps.AddPermission(new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.PathDiscovery | System.Security.Permissions.FileIOPermissionAccess.Read, HttpContext.Current.Server.MapPath("/app_data/www_somesite_com")));
ps.PermitOnly();
}
}
public class SomePlugin : PluginBase<SomePlugin>
{
public SomePlugin
{
File.WriteAllText("c:\test.txt", "This should not be possible, but it is.. why?");
}
}
公共抽象类插件库
{
公共插件库
{
PermissionSet ps=新的PermissionSet(System.Security.Permissions.PermissionState.None);
ps.AddPermission(新建System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.PathDiscovery | System.Security.Permissions.FileIOPermissionAccess.Read,HttpContext.Current.Server.MapPath(“/app_data/www_somesite_com”));
ps.PermitOnly();
}
}
公共类SomePlugin:PluginBase
{
公共SomePlugin
{
writealText(“c:\test.txt”,“这应该是不可能的,但它是..为什么?”);
}
}
非常感谢 解决方案实际上非常简单,因为您可以实现自己的属性(这允许您以编程方式解析允许的路径,而不必为decorator属性使用常量)
上面的类将启用
[CustomFileIOPermission(SecurityAction.PermitOnly)]
的使用,并将有效地保护其他地方的文件。这几乎满足了我的所有需要。问题是,我正在创建一个软件,用户可以自由上传一个usercontrol,我需要检查他们是否实际实现了该属性。出于某种原因(可能是设计原因),我无法检查该安全属性是否实际实现了,因为它没有显示在GetCustomAttributes方法返回的列表中。任何人都知道如何检查该属性是否已实现。我认为您应该为此问题创建一个新问题。我认为重要的是将问题分成更小的任务,以保持其他人对问题的兴趣,而不是为非常独特的问题提供精确的解决方案,我相信这也会给你更多的答案。你是对的,这应该属于另一个问题。我在这里添加了一个新问题:谢谢你的第一个答案:)
using System.Security;
using System.Security.Permissions;
public sealed class CustomFileIOPermission : CodeAccessSecurityAttribute
{
public CustomFileIOPermission(SecurityAction action)
: base(action)
{
}
public override IPermission CreatePermission()
{
// You can use your `HttpContext` or similar at this point to resolve the path
string allowedPath = @"D:\test";
return new FileIOPermission(FileIOPermissionAccess.Write, allowedPath);
}
}