Como a segurança do .NET realmente funciona?

votos
1

Eu só vi esta pergunta:

Compreender parâmetro do .NET “SecurityAction” para as permissões

E eu tenho uma pergunta. Com o seguinte código:

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))
    {
    }
}

por que o código de produzir uma exceção de segurança com a chamada para Layer2? Como é tratado o objeto de permissão, eu imagino que o coletor de lixo iria destruir o objeto, já que eu não tenho uma referência ativa para ele, mas o código diz Caught , e, em seguida, OK , então claramente a negação de permissão está em vigor para a chamada através Layer2.

O que da? o que estou perdendo? Eu vou admitir a ser um iniciante quando se trata do sistema de segurança / permissão no .NET então me perdoe se esta questão é realmente básico.

Será que uma permissão de segurança / negação como esta bandeira a pilha ou algo assim? Caso contrário, por que não é em vigor para Layer2b? É o mesmo segmento, de forma tão clara, embora não é morto pela coleta de lixo, que está sendo removido / destruído / limpo em algum momento.

Publicado 09/12/2008 em 23:25
fonte usuário
Em outras línguas...                            


2 respostas

votos
3

Chamando .Deny () em um CodeAccessPermission fará com que o tempo de execução Segurança do .NET para definir o sinalizador negar no objeto de segurança para o quadro de pilha atual para essa permissão. Assim, mesmo se você chamar GC.Collect () depois de chamar .Deny (), ele realmente não importa, a permissão permanecerá em vigor. O objeto de permissão é apenas uma representação do estado de parte do tempo de execução de segurança do .NET em um ponto no tempo (um quadro de pilha).

Basta usar .NET Reflector para saber mais.

Respondeu 09/12/2008 em 23:39
fonte usuário

votos
0

Após a primeira olhada, eu acho que o objeto de permissão ainda está no escopo, como é definido dentro do método, ele cai fora do escopo após a conclusão do método Layer2, permitindo assim que a última linha de seu aplicativo para funcionar.

Como observado pela resposta aceite, este é becuase está no escopo para a pilha atual, relacionado ao escopo do objeto padrão, você simplesmente não gerir a referência. Essa é a melhor maneira de se lembrar

Respondeu 09/12/2008 em 23:36
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more