在ASP.NET incode中设置FileIOPermissions

时间:2009-07-21 12:31:33

标签: asp.net file-permissions

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

我尝试在插件类基类中设置访问权限,但即使这样,加载的插件类似乎也具有完整的文件访问权限。

我无法使用属性设置权限,因为路径会根据加载页面的人而改变。

这是代码片段:

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

非常感谢提前!

1 个答案:

答案 0 :(得分: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)]并有效保护其他地方的文件。