Я создал следующий атрибут:
[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.
почему, черт возьми, я его получаю и что это на самом деле значит?
Проблема заключается в ваших определениях конструктора. Вам нужно заменить два существующих конструктора одним конструктором, который принимает только аргумент SecurityAction. (См. раздел «Примечания для наследников» по адресу http://msdn.microsoft.com/en-us/library/system.security.permissions.codeaccesssecurityattribute.aspx.) Причина этого кроется в механизм десериализации, используемый для атрибутов разрешений.
Я бы либо изменил тип параметра конструктора для role
с String
на Roles
(в этом случае вам нужно будет измените также несколько других вещей)
public OperationPermissionAttribute(SecurityAction action, Roles role, ...
или выполните ToString()
при вызове конструктора:
[OperationPermission(SecurityAction.Demand, Roles.Administrator.ToString(), "UserService", "Remove")]
Лично я бы предпочел первый вариант.