1

如何检查并确保一个类使用我自己的自定义安全属性?我知道我可以使用反射来获取普通属性,但是如果自定义属性基于如下所示的安全属性,则反射不会显示它。有什么办法可以检查吗?

为什么我需要这个是为了确保加载到基于云的系统的插件必须使用安全属性,以便加载的类无法访问任何受限制的文件等等。

这是我正在使用的自定义安全类:

public class PluginSection : CodeAccessSecurityAttribute
{
    public PluginSection(SecurityAction action)
        : base(action)
    {
    }

    public override IPermission CreatePermission()
    {
        // WebSites.GetInstance().LocalBaseDir returns the base directory where the class has accesss to login
        return new FileIOPermission(FileIOPermissionAccess.Write, WebSites.GetInstance().LocalBaseDir);
    }

}

我必须使用基于 CodeAccessSecurityAttribute 的类,这样 FileIOPermission 才能工作。

此外,如果有另一种方法来限制正在加载的插件的访问,我也可以使用它。

4

3 回答 3

3

反射似乎对我有用:

using System;
using System.Diagnostics;
using System.Security;
using System.Security.Permissions;

public class PluginSection : CodeAccessSecurityAttribute
{
    public PluginSection(SecurityAction action)
        : base(action)
    {
    }

    public override IPermission CreatePermission()
    {
        // Removed for demo purposes
        return null;
    }

}

class NotApplied {}

[PluginSection(SecurityAction.Demand)]
class Applied{}

class Test
{
    static void Main()
    {
        Console.WriteLine(IsPluginSection(typeof(Applied)));
        Console.WriteLine(IsPluginSection(typeof(NotApplied)));
    }

    static bool IsPluginSection(Type type)
    {
        return type.IsDefined(typeof(PluginSection), false)
    }
}
于 2009-09-17T16:31:26.390 回答
0

我认为没有必要使用反射来检查是否为插件分配了属性。权限基于范围,因此它们将在您的调用层次结构中向下传播。

如果您当前的设计可能,您应该只使用自定义属性装饰执行代码的方法:

[SomePermission(SecurityAction.PermitOnly)]
public void PluginExecutor(Plugin plugin)
{
    plugin.Something();
}

Something只会被赋予与您的PluginExecutor方法相同的权利。因此,此时您可以分配任何权限,而不必担心插件是否使用它们 - 并且不必依赖反射。

于 2009-09-18T09:15:40.100 回答
0

我没有答案,但如果它为人们提供更多信息来重现该问题:

[TestFixture]
public class SecurityExperiments
{
    [Test]
    public void ShouldGetCustomSecurityAttributes()
    {
        Assert.That(typeof (Applied).GetCustomAttributes(true),
                    Has.Some.InstanceOf<PluginSection>());
    }

    public class PluginSection : CodeAccessSecurityAttribute
    {
        public PluginSection(SecurityAction action)
            : base(action)
        {
        }

        public override IPermission CreatePermission()
        {
            // Removed for demo purposes
            return null;
        }

    }

    [PluginSection(SecurityAction.Demand)]
    class Applied { }
}

原因(至少对于我的测试项目):

System.TypeLoadException: Could not load type 'PluginSection' from assembly 'StackOverflow, Version=1.0.0.0, Culture=neutral'.
at System.Reflection.PseudoCustomAttribute._GetSecurityAttributes(Void* module, Int32 token, Object[]& securityAttributes)
at System.Reflection.PseudoCustomAttribute.GetCustomAttributes(RuntimeType type, Type caType, Boolean includeSecCa, ref Int32 count)
at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeType type, RuntimeType caType, Boolean inherit)
at System.RuntimeType.GetCustomAttributes(Boolean inherit)
at StackOverflow.SecurityExperiments.ShouldGetCustomSecurityAttributes() in SecurityExperiments.cs: line 13 
于 2009-09-18T10:00:59.373 回答