2010-08-27 7 views
8

ho creato il seguente attributo:personalizzato 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; 
    } 
} 

che uso in questo modo:

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

L'esecuzione del codice mi dà il seguente errore:

Manca una richiesta costruttore. (Eccezione da HRESULT: 0x8013143B), è una COMException.

perché diavolo ho capito e cosa significa veramente?

+0

Non riconosco "Roles.Administrator". Stai cercando di eseguire questo in .NET 4.0? CAS è deprecato. –

+0

È una classe statica con i nostri ruoli. – jgauffin

+0

Cosa dovrei usare al posto di CAS? – jgauffin

risposta

0

avrei neanche cambiare il tipo di parametro di costruzione per roleString-Roles (nel qual caso si avrebbe bisogno di cambiare un paio di altre cose)

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

o fare ToString() sulla chiamata al costruttore:

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

Preferirei personalmente la prima opzione.

+0

Utilizziamo i nostri ruoli personalizzati, quindi l'utilizzo di stringhe. Ma questa non è la causa del mio errore? – jgauffin

Problemi correlati