Пользовательский CodeAccessSecurityAttribute

Я создал следующий атрибут:

[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.

почему, черт возьми, я его получаю и что это на самом деле значит?

8
задан jgauffin 27 August 2010 в 14:21
поделиться

2 ответа

Проблема заключается в ваших определениях конструктора. Вам нужно заменить два существующих конструктора одним конструктором, который принимает только аргумент SecurityAction. (См. раздел «Примечания для наследников» по ​​адресу http://msdn.microsoft.com/en-us/library/system.security.permissions.codeaccesssecurityattribute.aspx.) Причина этого кроется в механизм десериализации, используемый для атрибутов разрешений.

8
ответ дан 5 December 2019 в 20:11
поделиться

Я бы либо изменил тип параметра конструктора для role с String на Roles (в этом случае вам нужно будет измените также несколько других вещей)

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

или выполните ToString() при вызове конструктора:

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

Лично я бы предпочел первый вариант.

0
ответ дан 5 December 2019 в 20:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: