Domanda

Ho appena visto questa domanda:

Comprensione del parametro "SecurityAction" di .NET per le autorizzazioni

E ho una domanda.Con il seguente codice:

private void button1_Click(object sender, EventArgs e)
{
    Layer1();
    MessageBox.Show("OK");
}

private void Layer1()
{
    try
    {
        Layer2();
    }
    catch (SecurityException)
    {
        MessageBox.Show("Caught");
    }
    Layer2b();
}

private void Layer2()
{
    new System.Security.Permissions.FileIOPermission(PermissionState.Unrestricted).Deny();
    GC.Collect();
    Layer3();
}

private void Layer2b()
{
    Layer3();
}

[FileIOPermission(SecurityAction.LinkDemand, Write=@"C:\temp")]
private void Layer3()
{
    using (FileStream stream = new FileStream(@"C:\temp\test.txt", FileMode.Create))
    {
    }
}

perché il codice produce un'eccezione di sicurezza con la chiamata a Layer2?Come viene trattato l'oggetto permesso, immagino che il garbage collector distrugga l'oggetto, dal momento che non ho un riferimento attivo ad esso, ma il codice dice Preso, poi OK, quindi chiaramente la negazione dell'autorizzazione è in vigore per la chiamata tramite Layer2.

Cosa dà?Cosa mi manca?Ammetto di essere un principiante assoluto per quanto riguarda il sistema di sicurezza/permessi in .NET, quindi perdonami se questa domanda è davvero basilare.

Un'autorizzazione/rifiuto di sicurezza come questa contrassegna lo stack o qualcosa del genere?Altrimenti, perché non è in vigore per Layer2b?È lo stesso thread, quindi chiaramente, sebbene non venga ucciso dalla garbage collection, ad un certo punto verrà rimosso/distrutto/ripulito.

È stato utile?

Soluzione

La chiamata a .Deny() su CodeAccessPermission farà sì che il runtime di sicurezza .NET imposti il ​​flag di negazione sull'oggetto di sicurezza per lo stack frame corrente per tale autorizzazione.Quindi, anche se chiami GC.Collect() dopo aver chiamato .Deny(), non ha molta importanza, l'autorizzazione rimarrà effettiva.L'oggetto permesso è semplicemente una rappresentazione dello stato della parte del runtime di sicurezza .NET in un determinato momento (uno stack frame).

Basta usare .NET Reflector per saperne di più.

Altri suggerimenti

A prima vista, immagino che l'oggetto di autorizzazione sia ancora nell'ambito, poiché è definito all'interno del metodo, non rientra nell'ambito dopo il completamento del metodo Layer2, consentendo così all'ultima riga dell'applicazione di funzionare .

Come notato dalla risposta accettata, questo è perché rientra nell'ambito dello stack corrente, relativo all'ambito dell'oggetto standard, semplicemente non gestisci il riferimento. Questo è il modo migliore per ricordarlo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top