Attributo AllowPartiallyTrustedCallers

In determinate circostanze, è possibile che una applicazione ASP .NET restituisca un errore del tipo “Configuration Error”, “Required permissions cannot be acquired”. Il testo di questo errore è fuorviante, nel senso che non fornisce alcun dettaglio, ma c’è un motivo ben preciso. Esso si verifica quando un membro pubblico di una classe inserita in un assembly firmato con uno strong name e registrato nella GAC, viene chiamato da codice situato in un assembly che non dispone del permesso “FullTrust”. Infatti, come regola generale, per poter accedere ai membri pubblici di classi inseriti in assembly firmati con strong name è necessario che il codice chiamante abbia il permesso FullTrust. Qualsiasi altro permesso genera una SecurityException, mascherata da ASP .NET nello “strano” messaggio di errore menzionato prima, per non fornire dettagli sull’errore che potrebbero risultare pericolosi. Questo requisito è dovuto al fatto che il CLR aggiunge una richiesta “Link Demand” per il permesso FullTrust (quindi solo per il codice immediatamente prima nello stack delle chiamate e non per tutto il codice nello stack) per ogni membro pubblico delle classi situate in assembly firmate con strong name. Questo errore può avvenire anche se l’assembly in questione possiede il permesso “FullTrust” garantitogli dall’amministratore di sistema, ma il suo codice “rifiuta” determinati permessi, utilizzando ad esempio la modalità SecurityAction.RequestRefuse oppure SecurityAction.RequestOptional. In questo caso l’assembly è a tutti gli effetti un “partially trusted assembly”. Il comportamento garantito dal CLR è corretto per la stragrande maggioranza delle situazioni, ma può essere sovrascritto per far fronte a situazioni in cui un assembly “strong named” deve essere richiamato da un assembly “partially trusted”. Per permettere questo, è necessario decorare l’assembly “strong named” con l’attributo AllowPartiallyTrustedCallerAttribute(). Così facendo aumentano i potenziali rischi di sicurezza dell’uso del codice.

Comunque, questa situazione non può essere risolta nel modo citato se la singola classe all’interno di un assembly “strong named” richiede esplicitamente il permesso “FullTrust” per i chiamanti attraverso un LinkDemand oppure un Demand normale. In questo caso, nonostante l’attributo AllowPartiallyTrustedCallers a livello dei assembly, questa classe in particolare continuerà a generare una SecurityException nel caso di codice chiamante che non sia “FullTrust”.