2009-07-21 61 views
1

我有这个加载插件类型组件的小应用程序,其他用户可以免费上传到服务器。但我不希望用户能够访问其他用户文件。我需要将每个插件组件的访问权限设置为受限制的访问权限。在ASP.NET中设置FileIOPermissions incode

我试图设置插件类基类内的访问,但即使如此,加载的插件类似乎有完整的文件访问。

我无法设置具有属性的权限,因为路径会根据谁加载页面而发生变化。

下面是一个代码snippest:

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?"); 
} 
} 

提前非常感谢!

回答

0

该解决方案实际上非常简单,因为您可以实现自己的属性(它允许您以编程方式解析允许的路径,而不必为decorator属性使用常量)。

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); 
    } 
} 

上面的类将允许使用的[CustomFileIOPermission(SecurityAction.PermitOnly)]和其他地方将有效地保护文件。

+0

这几乎做我需要的一切。问题是我正在创建软件,用户可以自由地上传usercontrol,并且需要检查他们是否实际实现了该属性。出于某种原因(可能是通过设计?)我无法检查该安全属性是否实际实现,因为它没有显示在GetCustomAttributes方法返回的列表中。任何人都知道如何检查该属性是否被执行。 – Gabfine 2009-09-02 18:11:02