8

次の属性を作成しました。

[Serializable]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class OperationPermissionAttribute : CodeAccessSecurityAttribute
{
    private static PrincipalPermission _revoke = new PrincipalPermission(PermissionState.None);
    private static PrincipalPermission _allow = new PrincipalPermission(PermissionState.Unrestricted);
    private string _role;
    private string _task;
    private string _operation;

    public OperationPermissionAttribute(SecurityAction action, string role, string task, string operation) : base(action)
    {
        _role = role;
        _task = task;
        _operation = operation;
    }

    public OperationPermissionAttribute(string role, string task, string operation)
        : base(SecurityAction.Demand)
    {
        _role = role;
        _task = task;
        _operation = operation;
    }

    public override System.Security.IPermission CreatePermission()
    {
        var principal = System.Threading.Thread.CurrentPrincipal as AzManPrincipal;
        if (principal == null)
            return _revoke;

        bool result = principal.IsOperationAllowed(_role, _task, _operation);
        return result ? _allow : _revoke;
    }
}

私はこのように使用します:

    [OperationPermission(SecurityAction.Demand, Roles.Administrator, "UserService", "Remove")]
    public void Add(User user)
    {
        user.ValidateOrThrow();
        _repository.Add(user);
    }

コードを実行すると、次のエラーが表示されます。

必要なコンストラクターがありません。(HRESULT からの例外: 0x8013143B)、COMException です。

なぜ私はそれを得るのですか?それは本当に何を意味するのですか?

4

2 に答える 2

8

問題は、コンストラクターの定義にあります。2 つの既存のコンストラクターを、SecurityAction 引数のみを取る単一のコンストラクターに置き換える必要があります。( http://msdn.microsoft.com/en-us/library/system.security.permissions.codeaccesssecurityattribute.aspxの「継承者への注意」セクションを参照してください。)この理由は、権限属性に使用される逆シリアル化メカニズムにあります。 .

于 2010-08-30T12:43:28.080 に答える
0

コンストラクターのパラメーターの型をroletoStringRoles変更します (この場合、他にもいくつか変更する必要があります)。

public OperationPermissionAttribute(SecurityAction action, Roles role, ...

またはToString()コンストラクター呼び出しで行います:

[OperationPermission(SecurityAction.Demand, Roles.Administrator.ToString(), "UserService", "Remove")]

私は個人的に最初のオプションを好みます。

于 2010-08-27T14:34:30.610 に答える