如何检查C#类是否使用了安全属性

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

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

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

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可以工作。

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

反思似乎对我很好:

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

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

如果可以使用当前设计,则应该使用自定义属性修饰执行代码的方法:

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

只有与PluginExecutor方法相同的权限。 因此,您可以在此时分配任何权限,而无需担心插件是否使用它们 – 而且不必依赖于reflection。

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

 [TestFixture] public class SecurityExperiments { [Test] public void ShouldGetCustomSecurityAttributes() { Assert.That(typeof (Applied).GetCustomAttributes(true), Has.Some.InstanceOf()); } 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