Durante l'analisi di un nuovo progetto, qualcuno (ndr guardandomi) ha posto la seguente domanda.
"Cosa significa chiedere i permessi per svolgere una determinata azione in un contesto generico applicativo? "
La risposta a questa domanda può sembrare decisamente semplice, tuttavia non è proprio così ovvia. Pertanto, ho proposto di aprire un dibattito al riguardo. Ogniuno ha espresso la sua opinione ed il risultato generale è stato che, per richiesta di permessi s'intende il reclamare il permesso ad eseguire una determinata operazione su un determinato componente. La mia reazione è stata piuttosto inusuale, ho chiesto di realizzare un semplice snippet che chiamasse un metodo di un mio particolare assembly. Il risultato è stato questo
// Snippet - Riunione 5
InteractiveCaller _caller = new InteractiveCaller;
// Chiamata all'oggetto
_caller.Ask();
Cosa esegue il metodo Ask() non è interessante. Chiamate ad un WebService o la semplice lettura di un file.. non importa. Prima di lanciare in esecuzione lo snippet ho chiesto ai ragazzi dove si aspettassero un possibile errore di sicurezza. La risposta è caduta sulla chiamata al metodo Ask();. Preso atto di questo, lancio in esecuzione il codice e.. l'errore di sicurezza si è scatenato al momento in cui si è provato ad istanziare l'oggetto InteractiveCaller.
La riposta ai vari perchè è arrivata dopo aver mostrato il codice sorgente del componente.
public class InteractiveCaller
{
[StrongNameIdentityPermission(SecurityAction.LinkDemand,PublicKey="bh56822...")]
public void Ask()
{
Console.WriteLine("Ciao Mondo");
}
}
Proprio così, la cosa interessante, del demanding permissions, è la possibilità di creare classi che accettano unicamente chiamate da ben determinati oggetti. Nel caso del codice appena mostrato, solo le chiamate dall'assembly aventi PublicKeyToken corrispondente a quello specificato posso permettersi di chiamare il metodo Ask(). Per i curiosi che vogliono capire il come questo possa essere reso possibile.. ecco la spiegazione tecnica.
Un Link Demand non viene mai risolto a runtime (quando si crea l'oggetto), ma solo quando la classe è compilata Just in Time (JIT). Questo significa che, se si vuole accedere ad una risorsa che si conosce presenti dei Link Demands, si deve sempre prima essere sicuri di poter eseguire quel codice.
Nel caso in cui si voglia capire perchè sia possibile chiamare un Link Demand (senza ricevere eccezioni) da parte di un assembly non firmato, beh, la risposta c'è.. ma occupa troppo posto. Ne parliamo in Security 29.