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

votos
5

Alguém pode explicar o significado de e efeitos dos valores para a enumeração SecurityAction?

A página MSDN não é muito clara. Diz LinkDemand ocorre a compilação just-in-time enquanto a procura ocorre em tempo de execução.

Por que a distinção e em que situações que eu iria usar LinkDemand em oposição a demanda?

Da mesma forma, quais são os casos de uso de outros valores interessantes como InheritenceDemand, Assert e PermitOnly.

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


1 respostas

votos
19

LinkDemand basicamente requer o código de chamada para ter a permissão especificada. A demanda, por outro lado, requer não só o código de chamada para ter a permissão especificada, mas também o código que chamou o código de chamada, e o código que chamou aquele, e assim por diante, todo o caminho até a pilha (ou até que um Assert é encontrada; ver abaixo).

LinkDemand pode ser executada em tempo de compilação JIT, porque se o compilador JIT atinge uma declaração que chama um método com um LinkDemand, ele pode determinar imediatamente se o código de chamada tem a permissão ou não. A demanda tem que ser executada em tempo de execução cada vez que uma chamada é feita para o método, porque não é possível em tempo de compilação para saber o que será na pilha durante qualquer chamada. Como tal, LinkDemand é muito mais eficiente. No entanto, a desvantagem de que a eficiência é menor segurança. Com LinkDemand, você está confiando que o código de chamada não vai deixar o seu código de chamada (que pode ou não ter a permissão) usá-lo para fins nefastos. (Em outras palavras, você está confiando que não há falhas de segurança no código de chamada que seus chamadores podem explorar para obter acesso indiretamente ao método com o LinkDemand.) Com a demanda,

Assert é basicamente um curto-circuito para Demand. A verificação de segurança que acontece com a demanda pára se um chamador na pilha tem um Assert ativo (em outras palavras, somente os chamadores na pilha até o Assert tem que ter a permissão). Então, como LinkDemand, você tem que confiar que o código com o Assert não pode ser explorada por seus interlocutores.

Negar é também um curto-circuito para a demanda, mas em vez de afirmar uma permissão que anula uma permissão que um chamador possa ter. Você usaria isso para ajudar a evitar possíveis falhas de segurança, garantindo que nenhuma permissão estranhas estão em vigor durante uma chamada que pode ser explorado.

PermitOnly é como Negar, exceto em vez de negar uma permissão específica, ele nega todas as permissões, exceto aquele especificado.

InheritanceDemand, ao contrário dos outros, não está directamente relacionado com chamadas de método, mas diz que uma classe que não tem a permissão não pode herdar da classe com o InheritanceDemand. Isto poderia ser usado, por exemplo, parar de código não confiável de ter acesso a membros protegidos da classe que de outra forma seriam acessíveis a classes descendentes.

Respondeu 09/12/2008 em 22:56
fonte usuário

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