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

}

FileIOPermissionが機能するように、CodeAccessSecurityAttributeに基づくクラスを使用する必要があります。

また、ロードされているプラ​​グインのアクセスを制限する別の方法がある場合は、それも使用できます。

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

答えはありませんが、問題を再現するためのより多くの情報が人々に提供される場合は、次のようになります。

[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 に答える
0

プラグインに属性が割り当てられているかどうかを確認するためにリフレクションを使用する必要はないと思います。アクセス許可はスコープに基づいているため、呼び出し階層の下位に伝播します。

現在のデザインで可能であれば、コードを実行するメソッドをカスタム属性で装飾する必要があります。

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

Somethingメソッドと同じ権限のみが付与されますPluginExecutor。したがって、プラグインがそれらを使用するかどうかを心配することなく、またリフレクションに依存することなく、この時点で任意のアクセス許可を割り当てることができます。

于 2009-09-18T09:15:40.100 に答える