Demandas de segurança

Para garantir que somente os chamadores que receberam uma permissão especificada podem chamar seu código, você pode declarativamente ou imperativamente exigir que os chamadores de seu código tenham uma permissão específica ou conjunto de permissões. Uma demanda faz com que o tempo de execução execute uma verificação de segurança para impor restrições no código de chamada. Durante uma verificação de segurança, o tempo de execução passa pela pilha de chamadas, examinando as permissões de cada chamador na pilha e determinando se a permissão está sendo concedida para cada chamador. Se um chamador que não tem permissão necessária for encontrado, a verificação de segurança falha e um SecurityException é lançado. As únicas demandas que não levam a um exame de pilha são demandas de links, que verificam somente o chamador imediato.

Você pode fazer com que uma verificação de segurança ocorra sempre que um método específico seja chamado ou antes que um bloco específico de código seja executado. Se você quer que a verificação de segurança ocorra quando qualquer membro de uma classe particular seja chamado, você pode colocar uma demanda antes da classe para que se aplique a cada membro da classe. O restante deste tópico explica como fazer demandas de segurança, quando for preciso, e por que você deve escolher um tipo de demanda de segurança em vez de outra.

Se você estiver escrevendo uma biblioteca que acessa diretamente um recurso protegido, e se esse acesso é exposto para o chamador, você deve fazer uma demanda de segurança na biblioteca para ajudar a verificar que todos os chamadores na pilha de chamada tenham permissão para acessar este recurso. As demandas podem ser declarativas ou obrigatórias. Observe que as demandas nunca devem ser feitas em um construtor de classe, pois não há garantias de que o código do construtor de classe será executado em um ponto ou em um contexto específico. Como o estado da pilha de chamadas em um construtor de classe não é bem definido, as demandas colocadas em construtores de classe podem produzir resultados inesperados e indesejados.

Você deve usar as seguintes diretrizes, independentemente do tipo de demanda que faz:

  • Certifique-se de que um objeto posa ser criado apenas pelos chamadores que têm uma permissão específica colocando a demanda no nível de classe daquele objeto. Por exemplo, suponha que você tenha uma classe chamada myFileStream, que deriva da classe FileStream e deseja garantir que somente os chamadores autorizados possam criar instâncias do myFileStream. Você deve colocar uma demanda declarativa para um objeto FileIOPermission que representa o direito de acessar o fluxo criado por myFileStream no nível de classe de classe de myFileStream .

  • Você também pode colocar demandas no código que obtém ou define uma propriedade. Em geral, você coloca demandas para permissões menos restritivas no acessador de recepção ao invés do acessador de ajuste, a menos que a propriedade contenha informações confidenciais, como uma senha.

    Dica

    As verificações de segurança baseada em função têm a semântica um pouco diferente das verificações de segurança de acesso a código.Para obter mais informações, consulte Segurança baseada em função.

    Dica

    As demandas podem ser aplicadas apenas nos níveis de classe, métodos, eventos e propriedades; os assemblies e os membros variáveis não privados individuais não são protegidos pelas demandas.As demandas colocadas no nível de assembly ou variável não privada não irão gerar um aviso do compilador.Portanto, é importante usar propriedades em vez de membros públicos para garantir a proteção que as demandas oferecem.

Consulte também

Referência

SecurityException

Conceitos

Gravando bibliotecas de classe seguras

Outros recursos

Segurança de acesso do código