2010-08-27 6 views
8

He creado el siguiente atributo:personalizada 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; 
    } 
} 

que utilizo como esto:

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

ejecutar el código me da el siguiente error:

Falta una necesaria constructor. (Excepción de HRESULT: 0x8013143B), es una excepción COMException.

¿Por qué demonios lo entiendo y qué significa realmente?

+0

No reconozco 'Roles.Administrator'. ¿Estás tratando de ejecutar esto en .NET 4.0? CAS está en desuso. –

+0

Es una clase estática con nuestros propios roles. – jgauffin

+0

¿Qué debo usar en lugar de CAS? – jgauffin

Respuesta

0

yo tampoco cambiar el tipo de parámetro constructor para roleString-Roles (en cuyo caso se tendría que cambiar algunas otras cosas también)

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

o hacer ToString() en la llamada al constructor:

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

Preferiría personalmente la primera opción.

+0

Estamos utilizando nuestros propios roles personalizados, de ahí el uso de cadenas. Pero esa no es la causa de mi error? – jgauffin