如何检查是否C#类使用了安全属性(How to check if C# class has secu

2019-08-07 07:30发布

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

为什么我需要这是为了确保被加载到基于云的系统插件必须使用安全属性,这样得到的负载不能访问任何受限制的文件等类。

下面是我使用的自定义安全类:

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的会工作。

此外,如果有另一种方式来限制插件的访问被加载,我可以用这一点。

Answer 1:

反射似乎为我工作得很好:

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


Answer 2:

我不认为有必要使用反射来检查,如果一个属性分配给该插件。 权限是基于范围,所以他们会在你调用层次向下传播。

如果有可能与当前的设计,你应该只是装饰,与自定义属性执行你的代码的方法:

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

Something只会给予同样的权利,你的PluginExecutor方法。 因此,您可以在此点指派的任何权限,无需担心如果插件使用他们 - 而不必依赖于反思。



Answer 3:

我没有答案,但如果它给了人们更多的信息来重现问题:

[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 


文章来源: How to check if C# class has security attribute used