Si tratta di uno degli ottimi meccanismi di protezione di .NET Framework; tuttavia non si dovrebbe verificare una SecurityException in un assembly Partially Trusted (come quelli eseguiti da un drive di rete) a meno che esso non si colleghi ad assembly senza strong name o con strong name ma senza l'attributo "AllowPartiallyTrustedCallers". Questa eccezione può anche verificarsi con un assembly Partially Trusted che direttamente o indirettamente effettua chiamate a codice unmanaged. Verifica tra gli assembly a cui fai riferimento se ne compare uno o più che non rispetta questi requisiti.
In ogni caso ecco un consiglio per risolvere radicalmente il tuo problema senza compromettere la sicurezza CAS:
Primo passo: dare uno strong name ai tuoi assembly:
- con l'utility sn (inclusa nel .NET Framework SDK) crea una nuova coppia di chiavi per firmare i tuoi assembly; nello specifico apri il prompt dei comandi nella directory in cui è contenuto sn.exe e digita sn -k nomefile.snk, dove nomefile è il nome del file che conterrà la tua nuova coppia di chiavi strong name;
- copia il tuo file snk nella tua directory di sviluppo (di solito è qualcosa come Documenti\Visual Studio Projects) e non darlo in giro;
- aggiungi al file assemblyinfo.vb di ogni tuo progetto di cui devi esegure il deploy su tutta la rete l'attributo <Assembly: AssemblyKeyFile("percorsocompleto\nomefile.snk")> (dove ovviamente percorsocompleto è il percorso completo della cartella in cui è contenuto il tuo file snk e nomefile.snk è il suo nome);
- ricompila i vari progetti.
A questo punto tutti i tuoi assembly saranno dotati di uno strong name e relativa chiave pubblica.
Secondo passo: dire a .NET Framework di fidarsi del tuo Strong Name
- Metti in rete o su un dischetto un tuo assembly con strong name;
- su una delle tue macchine apri il tool .NET Configuration (è in Strumenti di Amministrazione);
- nell'albero di cartelle posto nella parte sinistra della finestra spostati in Risorse del Computer\Criteri di protezione\Enterprise\Gruppi di Codice\All_code;
- fai click di destro su All_code e seleziona "Nuovo...";
- come nome inserisci qualcosa tipo "Assembly interni con strong name" o quello che vuoi; come descrizione metti "Dà agli assembly creati con lo strong name dell'amministratore tutti i privilegi";
- come condizione metti "Nome sicuro", e sotto fai click su "Importa..."; con la finestra "Importa nome sicuro dall'assembly" apri l'eseguibile di un tuo progetto con strong name che avevi messo su un dischetto o in rete;
- assicurati che nel campo "Chiave pubblica" ci siano una serie di cifre, e che le caselle Nome e Versione NON abbiano la spunta;
- fai click su "Avanti";
- assicurati che sia selezionato "Utilizza set di autorizzazioni esistente" e che nell'elenco a discesa sia selezionato "FullTrust";
- fai click su "Avanti" e quindi su "Fine".
Passo tre: distribuire i nuovi settaggi su tutta la rete
- Una volta creato il criterio di cui al passo precedente, nel .NET Configuration fai click di destro su "Criteri di protezione runtime" e seleziona "Crea package di distribuzione...";
- assicurati che sia selezionata la casella "Enterprise" e facendo click sul pulsante "Sfoglia..." scegli il posto dove salvare il file msi che verrà creato;
- fai click su "Avanti" e quindi su "Fine";
- copia il file msi così creato su una cartella condivisa sul server;
- loggato da amministratore lancia il pacchetto msi su tutti i PC su cui vorrai eseguire le tue applicazioni .NET.
Fine! A questo punto tutti i PC su cui avrai eseguito il pacchetto MSI si fideranno ciecamente di tutti gli assembly .NET firmati con il tuo strong name.
@mod: questa mi parrebbe una buona pillola...