Demandas

Você pode usar a chamada de demanda de segurança declarativamente ou imperativa para especificar as permissões que direta ou indiretas chamadores devem ter que acessar sua biblioteca. Chamadores diretos chamam explicitamente estático ou métodos de instância da sua biblioteca, durante a chamada de chamadores indireta estática ou métodos de instância de outra biblioteca que chama a sua biblioteca. Quando você usa uma demanda, qualquer aplicativo que inclui o seu código será executado somente se todos os chamadores diretos e indiretos tem as permissões que a demanda especifica. As demandas são particularmente úteis em situações em que a sua biblioteca de classe usa os recursos protegidos que não deseja ser acessadas pelo código não confiável. Demandas podem ser colocadas no código usando sintaxe declarativa ou imperativa.

Observe que a maioria de classes do.NET Framework já demandas associadas a eles, portanto você não precisa fazer uma demanda adicional sempre que usar uma classe que acessa um recurso protegido. Por exemplo, o StreamWriter classe automaticamente faz uma demanda de segurança para FileIOPermission sempre que for aberto. Se você fizer uma demanda por FileIOPermission ao usar o StreamWriter classe, você fará com que uma movimentação de pilha de ineficientes e redundantes ocorrer. Você deve usar as demandas para proteger os recursos personalizados que exigem permissões personalizadas.

Demandas podem ser declarativa ou imperativa.

Stack Walks

Demandas de reforçar a segurança realizando uma análise (chamada de uma stack walk) em que cada chamada de função (ou o quadro de pilha) na pilha de chamadas atual é examinado para a permissão especificada. Quando uma demanda é disparada ocorre o seguinte.

  • A stack walk começa no quadro de pilha de chamadores não pilha atual onde ocorre a demanda. Por exemplo, se a chamadas de método um método b e o método b tem uma demanda, a stack walk inicia-se no quadro de pilha do método do. Método b nunca é avaliado como parte do stack walk.

  • A stack walk passa a pilha de chamadas até alcançar o ponto de entrada de programa da pilha (geralmente o Main método) ou até um modificador de stack walk como uma declaração for encontrada. Para obter informações sobre a stack walk modificadores, consulte Substituindo as verificações de segurança.

  • Quando uma demanda e um modificador de stack walk (um assert, por exemplo) para a mesma permissão aparecem no mesmo quadro de pilha, a demanda tem precedência.

  • Sintaxe declarativa e imperativa não apresentar nenhuma diferença no comportamento.

  • Observe que uma demanda colocada em seu ponto de entrada do programa nunca obtém avaliada porque os stack walks sempre começa no quadro de pilha de chamada, mas nesse caso, não há nenhum quadro tal chamado para avaliar. Portanto exercida sobre um ponto de entrada do programa sempre teve êxito.

Solicitações declarativas

As solicitações declarativas colocar informações em metadados do seu código, usando atributos. Você pode usar a sintaxe declarativa para colocar uma demanda no nível do método do código ou a classe.

Se você colocar uma verificação de segurança declarativa no nível de classe, ele se aplica a cada membro da classe. Entretanto, se você colocar uma verificação de segurança declarativa no nível do membro, se aplica somente esse membro e substitui a permissão especificada no nível de classe, se houver. Por exemplo, suponha que você especificar a classe nível que PermissionA é necessária e para o Method1 da classe indicam que o PermissionB é necessária. Quando Method1 é chamado, uma verificação de segurança irá procurar somente PermissionB, mas outros métodos da classe ainda exigirão PermissionA.

O exemplo a seguir coloca uma demanda declarativa de permissão personalizada chamada CustomPermission em todos os chamadores da ReadData método. Esta permissão é uma permissão personalizada hipotética e não existe na.NET Framework. A permissão personalizada foi definido separadamente CustomPermissionAttribute faz com que a demanda. Nesse caso, leva um SecurityAction o sinalizador para especificar o tipo de demanda que executará o atributo.

<CustomPermissionAttribute(SecurityAction.Demand, Unrestricted := True)>Public Shared Function  ReadData() As String
   'Read from a custom resource.
End Function
[CustomPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
public static string ReadData()
{
   //Read from a custom resource.
}

Solicitações imperativas

As solicitações imperativas são colocadas no método nível do código, criando uma nova instância de um objeto de permissão e chamando o do objeto demanda método. Sintaxe imperativo não pode ser usado para colocar as demandas no nível de classe.

A demanda de imperativa colocar seu código efetivamente ajuda a proteger todos os códigos restantes no método em que o por demanda método é chamado. A verificação de segurança é executada quando o por demanda é executado; Se a verificação de segurança falhar, um SecurityException é lançada e o restante do código desse método ou membro nunca é executado, a menos que o SecurityException é capturado e manipulado.

O exemplo a seguir usa a sintaxe imperativa para colocar uma demanda em todos os chamadores para a permissão personalizada CustomPermission. Esse código cria uma nova instância da CustomPermission classe, passando a PermissionState.Unrestricted o sinalizador para o construtor. O por demanda , em seguida, é chamado de método.

Public Shared Sub ReadData()
   Dim MyPermission As New CustomPermission(PermissionState.Unrestricted)
   MyPermission.Demand()
   'Read from a custom resource.
End Sub  
public static void ReadData()
{
   CustomPermission MyPermission = new CustomPermission(PermissionState.Unrestricted);
   MyPermission.Demand();

   //Read from a custom resource.
}

Observação

O comportamento de otimização para a operação de demanda difere entre plataformas de 32 bits e de 64 bits.Em plataformas de 64 bits, uma demanda não verificará o conjunto de concessão do assembly que contém a demanda em casos onde outros assemblies chamados estão presentes.No entanto, essa otimização não causa uma elevação de privilégio porque uma movimentação de pilha ainda está sendo executada quando a chamada de assemblies estão presentes.Em plataformas de 32 bits, a operação de demanda verifica o conjunto de concessão do assembly que contém a demanda e todos os assemblies de chamada.

Consulte também

Referência

SecurityException

Conceitos

Estendendo metadados usando atributos

Demandas de segurança

Segurança de Acesso de código

Criando suas próprias permissões de acesso ao código

Adicionando suporte a segurança declarativa

Criação de bibliotecas de classe seguro