2

で飾られたクラスがありClaimsPrincipalPermissionsAttributeます。クラスには、 で装飾されたメソッドもありClaimsPrincipalPermissionsAttributeます。私が期待したのは:

まず、クラスをインスタンス化するときに、カスタム への呼び出しを取得しますClaimsAuthorizationManager。これは期待どおりに機能します。

2 番目に、メソッドを呼び出すと、 my への 2 つの呼び出しが発生しますClaimsAuthorizationManager。1 つはクラス レベルの属性からの Resource と Operation を持ち、もう 1 つはメソッド レベルの属性からです。これは動作しません。代わりにSecurityException、メソッドを呼び出すとスローされます。例外メッセージは次のとおりです。

埋め込まれたアクセス権セット オブジェクトのデコードに失敗しました。

何が起こっているのかを確認するために、 からコードをコピーしてカスタム アトリビュートを作成しましたClaimsPrincipalPermissionsAttributeCreatePermission()メソッドが自分の属性で呼び出され、ClaimsPrincipalPermission が正常に返されることがわかりますが、my が呼び出される前に例外がスローされClaimsAuthorizationManagerます。

私のコードは次のようになります。

using System;
using System.IdentityModel.Services;
using System.Security.Permissions;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            var test = new SecuredClass();

            test.MethodLevelSecuredMethod();

            Console.ReadKey();
        }
    }

    [ClaimsPrincipalPermission(SecurityAction.Demand, Resource = "SecuredClass", Operation = "GeneralAccess")]
    class SecuredClass
    {
        [ClaimsPrincipalPermission(SecurityAction.Demand, Resource = "MethodLevelSecuredMethod", Operation = "Call")]
        public void MethodLevelSecuredMethod()
        {
            Console.WriteLine("Called MethodLevelSecuredMethod");
        }
    }
}

私は何を間違っていますか?クラスレベルとメソッドレベルの両方で属性を宣言することは可能ですか?

私は.Net 4.5を使用しています。

4

2 に答える 2

0

CheckAccessクラスコンストラクター内で呼び出しを使用して、これを回避しました。

class SecuredClass
{
    public SecuredClass()
    {
        ClaimsPrincipalPermission.CheckAccess("SecuredClass", "GeneralAccess");
    }

    [ClaimsPrincipalPermission(SecurityAction.Demand, Resource = "MethodLevelSecuredMethod", Operation = "Call")]
    public void MethodLevelSecuredMethod()
    {
        Console.WriteLine("Called MethodLevelSecuredMethod");
    }
}
于 2014-04-07T17:45:57.210 に答える