Demandas
Você pode usar a telefonar de demanda de segurança forma declarativa ou imperativa para especificar as permissões que direta ou indiretas chamadores devem ter que acessar sua biblioteca.Os chamadores diretos chamam explicitamente estático ou métodos de instância da sua biblioteca, durante a telefonar indireta chamadores estática ou métodos de instância de outra biblioteca que chama sua biblioteca.Quando você usa uma demanda, qualquer aplicativo que inclui o código será executado somente se todos os chamadores diretos e indiretos tem as permissões que especifica a demanda.As demandas são particularmente úteis em situações em que sua biblioteca de classes usa recursos protegidos que deseja ser acessados por código não confiável.Demandas podem ser colocadas no código usando sintaxe declarativa ou imperativa.
Observe que a maioria das classes do .NET estrutura já ter demandas associadas a eles, portanto, você não precisa fazer uma demanda adicional sempre que você usar uma classe que acessa um recurso protegido.Por exemplo, a StreamWriter uma demanda de segurança por classe faráFileIOPermission sempre que for aberto.Se você fizer uma demanda por FileIOPermission quando você usa o StreamWriter classe, você fará um exame da pilha ineficientes e redundantes ocorrer.Você deve usar as demandas para proteger recursos personalizados que exigem permissões personalizadas.
Demandas podem ser declarativa ou imperativa.
Exames da pilha
As demandas de reforçar a segurança realizando uma análise (telefonar de uma stack walk) na qual cada função de telefonar (ou registro de ativação) na pilha de chamadas corrente é examinado para a permissão especificada.Quando uma demanda for disparada ocorre o seguinte.
A movimentação da pilha começa em registro de ativação de chamadores não pilha corrente onde ocorre a demanda.Por exemplo, se as chamadas de método A método B e o método B tem uma demanda, a movimentação da pilha começa na método do registro de ativação.Método B nunca é avaliado sistema autônomo parte de pilha walk.
A movimentação da pilha continua com a pilha de chamadas até alcançar o ponto de entrada do programa da pilha (geralmente o Main método) ou até um modificador de exame da pilha como uma declaração for encontrada. Para obter informações sobre a pilha de vai consulte modificadores, Substituindo verificações de segurança.
Quando uma demanda e um modificador de exame da pilha (uma declaração, por exemplo) para a mesma permissão aparecerem no mesmo registro de ativação, a demanda terá 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 é avaliada porque stack walks sempre começa no registro de ativação 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
Demandas declarativas colocam informações em metadados de seu código usando atributos.Você pode usar sintaxe declarativa para colocar uma demanda na classe ou o nível de método de seu código.
Se você colocar uma verificação de segurança declarativa no nível de classe, ela se aplica ao cada membro da classe.No entanto, se você colocar uma verificação de segurança declarativa no nível do membro, ele se aplica ao apenas naquele membro e substitui a permissão especificada no nível de classe, se houver.Por exemplo, suponha que você especificar a classe nível desse PermissionA é necessária e para Method1 da classe que você indicar PermissionB é necessária.Quando é chamado Method1, uma verificação de segurança irá procurar somente PermissionB, mas outros métodos da classe ainda exigem PermissionA.
O exemplo a seguir coloca uma demanda declarativa para uma 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 no .NET estrutura.A permissão personalizada tem um definido separadamente CustomPermissionAttribute Isso torna a demanda. Nesse caso, é necessário um SecurityAction.Demand sinalizar para especificar o tipo de demanda o atributo executará.
<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
Demandas imperativas são colocadas no nível do método do código, criando uma nova instância de um objeto de permissão e chamando Por solicitação método.Sintaxe imperativo não pode ser usado para colocar as demandas no nível de classe.
A demanda imperativa que você coloca no seu código efetivamente ajuda a proteger todo o código restante no método em que o Por solicitação método é chamado.A verificação de segurança é executada quando o Por solicitação é executado; se a segurança verificar falhar, um SecurityException é lançada e o restante do código em que 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 do CustomPermission classe, passando o PermissionState.Unrestricted sinalizar para o construtor.The Por solicitação método, em seguida, é chamado.
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 bit e 64 bit.Em plataformas de 64 bit, 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 do privilégio porque uma movimentação de pilha ainda é executada quando houver chamados assemblies.Em plataformas de 32 bit 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
Conceitos
Criando suas próprias permissões de acesso ao código
Adicionando suporte à segurança declarativa
Escrevendo seguro classe bibliotecas