Как проверить, используется ли в классе C # атрибут безопасности - PullRequest
1 голос
/ 17 сентября 2009

Как я могу проверить и убедиться, что класс использует мой собственный атрибут безопасности? Я знаю, что могу использовать отражение, чтобы получить нормальные атрибуты, но если пользовательский атрибут основан на атрибуте безопасности, как показано ниже, отражение не показывает его. Есть ли способ проверить это?

Зачем мне это нужно, чтобы убедиться, что подключаемый модуль, загружаемый в облачную систему, должен использовать атрибут безопасности, чтобы загружаемый класс не мог получить доступ к каким-либо закрытым файлам и т.

Вот пользовательский класс безопасности, который я использую:

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 работал.

Также, если есть другой способ ограничить доступ к загружаемому плагину, я мог бы использовать это тоже.

Ответы [ 3 ]

3 голосов
/ 17 сентября 2009

Отражение у меня нормально работает:

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)
    }
}
0 голосов
/ 18 сентября 2009

У меня нет ответа, но если он дает людям больше информации, чтобы воспроизвести проблему:

[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 
0 голосов
/ 18 сентября 2009

Я не думаю, что необходимо использовать отражение, чтобы проверить, назначен ли атрибут для плагина. Разрешения основаны на области действия, поэтому они будут распространяться вниз в иерархии вызовов.

Если это возможно с вашим текущим дизайном, вы должны просто украсить метод, который выполняет ваш код, с помощью пользовательского атрибута:

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

Something будут предоставлены только те же права, что и ваш метод PluginExecutor. Поэтому вы можете назначать любые разрешения на этом этапе, не беспокоясь о том, использует ли их плагин, и не полагаясь на отражение.

...