Noções básicas sobre o nível de proteção
A ProtectionLevel
propriedade é encontrada em muitas classes diferentes, como o ServiceContractAttribute e as OperationContractAttribute classes. A propriedade controla como uma parte (ou todo) de uma mensagem é protegida. Este tópico explica o recurso WCF (Windows Communication Foundation) e como ele funciona.
Para obter instruções sobre como definir o nível de proteção, consulte Como definir a propriedade ProtectionLevel.
Nota
Os níveis de proteção podem ser definidos apenas no código, não na configuração.
Noções Básicas
Para entender o recurso de nível de proteção, as seguintes instruções básicas se aplicam:
Existem três níveis básicos de proteção para qualquer parte de uma mensagem. A propriedade (onde quer que ocorra) é definida como um dos ProtectionLevel valores de enumeração. Por ordem crescente de proteção, incluem:
None
.Sign
. A parte protegida é assinada digitalmente. Isso garante a deteção de qualquer adulteração na parte da mensagem protegida.EncryptAndSign
. A parte da mensagem é criptografada para garantir a confidencialidade antes de ser assinada.
Você pode definir requisitos de proteção apenas para dados de aplicativos com esse recurso. Por exemplo, os cabeçalhos WS-Addressing são dados de
ProtectionLevel
infraestrutura e, portanto, não são afetados pelo .Quando o modo de segurança é definido como
Transport
, toda a mensagem é protegida pelo mecanismo de transporte. Portanto, definir um nível de proteção separado para diferentes partes de uma mensagem não tem efeito.O
ProtectionLevel
é uma maneira de o desenvolvedor definir o nível mínimo que uma vinculação deve cumprir. Quando um serviço é implantado, a associação real especificada na configuração pode ou não suportar o nível mínimo. Por exemplo, por padrão, a BasicHttpBinding classe não fornece segurança (embora possa ser habilitada). Portanto, usá-lo com um contrato que tenha qualquer configuração diferente fará com queNone
uma exceção seja lançada.Se o serviço exigir que o mínimo
ProtectionLevel
para todas as mensagens sejaSign
, um cliente (talvez criado por uma tecnologia não-WCF) pode criptografar e assinar todas as mensagens (que é mais do que o mínimo necessário). Nesse caso, o WCF não lançará uma exceção porque o cliente fez mais do que o mínimo. Observe, no entanto, que os aplicativos WCF (serviços ou clientes) não protegerão demais uma parte da mensagem, se possível, mas cumprirão o nível mínimo. Observe também que, ao usarTransport
como o modo de segurança, o transporte pode proteger demais o fluxo de mensagens porque é inerentemente incapaz de proteger em um nível mais granular.Se você definir explicitamente como
ProtectionLevel
umSign
ouEncryptAndSign
, então você deve usar uma associação com segurança ativada ou uma exceção será lançada.Se você selecionar uma associação que habilite a segurança e não definir a
ProtectionLevel
propriedade em nenhum lugar do contrato, todos os dados do aplicativo serão criptografados e assinados.Se você selecionar uma associação que não tenha a segurança habilitada (por exemplo, a classe tem a
BasicHttpBinding
segurança desabilitada por padrão) e aProtectionLevel
não estiver definida explicitamente, nenhum dos dados do aplicativo será protegido.Se você estiver usando uma associação que aplique segurança no nível de transporte, todos os dados do aplicativo serão protegidos de acordo com os recursos do transporte.
Se você usar uma associação que aplique segurança no nível da mensagem, os dados do aplicativo serão protegidos de acordo com os níveis de proteção definidos no contrato. Se você não especificar um nível de proteção, todos os dados do aplicativo nas mensagens serão criptografados e assinados.
O
ProtectionLevel
pode ser definido em diferentes níveis de escopo. Há uma hierarquia associada ao escopo, que é explicada na próxima seção.
Âmbito
Definir a ProtectionLevel
API na parte superior define o nível para todos os níveis abaixo dela. Se o ProtectionLevel
for definido para um valor diferente em um nível inferior, todas as APIs abaixo desse nível na hierarquia serão redefinidas para o novo nível (APIs acima dele, no entanto, ainda serão afetadas pelo nível superior). A hierarquia é a seguinte. Os atributos no mesmo nível são pares.
Nível de proteção de programação
Para programar o ProtectionLevel
em qualquer ponto da hierarquia, basta definir a propriedade como um valor apropriado ao aplicar o atributo. Para obter exemplos, consulte Como definir a propriedade ProtectionLevel.
Nota
Definir a propriedade em falhas e contratos de mensagem requer entender como esses recursos funcionam. Para obter mais informações, consulte Como definir a propriedade ProtectionLevel e Usando contratos de mensagem.
Dependência de endereçamento WS:
Na maioria dos casos, usar a ServiceModel Metadata Utility Tool (Svcutil.exe) para gerar um cliente garante que o cliente e os contratos de serviço sejam idênticos. No entanto, contratos aparentemente idênticos podem fazer com que o cliente lance uma exceção. Isso ocorre sempre que uma associação não suporta a especificação WS-Addressing e vários níveis de proteção são especificados no contrato. Por exemplo, a BasicHttpBinding classe não oferece suporte à especificação ou se você criar uma associação personalizada que não ofereça suporte a WS-Addressing. O ProtectionLevel
recurso depende da especificação WS-Addressing para habilitar diferentes níveis de proteção em um único contrato. Se a associação não suportar a especificação WS-Addressing, todos os níveis serão definidos para o mesmo nível de proteção. O nível de proteção efetivo para todos os âmbitos do contrato será definido para o nível de proteção mais forte utilizado no contrato.
Isso pode causar um problema difícil de depurar à primeira vista. É possível criar um contrato de cliente (uma interface) que inclui métodos para mais de um serviço. Ou seja, a mesma interface é usada para criar um cliente que se comunica com muitos serviços, e a interface única contém métodos para todos os serviços. O desenvolvedor deve tomar cuidado neste cenário raro para invocar apenas os métodos que são aplicáveis para cada serviço específico. Se a associação for a BasicHttpBinding classe, vários níveis de proteção não poderão ser suportados. No entanto, um serviço que responda ao cliente pode responder a um cliente com um nível de proteção inferior ao necessário. Neste caso, o cliente lançará uma exceção porque espera um nível de proteção mais alto.
Um exemplo do código ilustra esse problema. O exemplo a seguir mostra um contrato de serviço e um contrato de cliente. Suponha que a associação é o <elemento basicHttpBinding> . Portanto, todas as operações em um contrato têm o mesmo nível de proteção. Este nível de proteção uniforme é determinado como o nível máximo de proteção em todas as operações.
O contrato de prestação de serviços é:
[ServiceContract()]
public interface IPurchaseOrder
{
[OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
<OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
Function Price() As Integer
End Interface
O código a seguir mostra a interface do contrato do cliente. Observe que ele inclui um Tax
método que se destina a ser usado com um serviço diferente:
[ServiceContract()]
public interface IPurchaseOrder
{
[OperationContract()]
int Tax();
[OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
<OperationContract()> _
Function Tax() As Integer
<OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
Function Price() As Integer
End Interface
Quando o cliente chama o Price
método, ele lança uma exceção quando recebe uma resposta do serviço. Isso ocorre porque o cliente não especifica a ProtectionLevel
no ServiceContractAttribute
e, portanto, o cliente usa o padrão (EncryptAndSign) para todos os métodos, incluindo o Price
método. No entanto, o serviço retorna o valor usando o Sign nível porque o contrato de serviço define um único método que tem seu nível de proteção definido como Sign. Nesse caso, o cliente lançará um erro ao validar a resposta do serviço.
Consulte também
- ServiceContractAttribute
- OperationContractAttribute
- FaultContractAttribute
- MessageContractAttribute
- MessageHeaderAttribute
- MessageBodyMemberAttribute
- ProtectionLevel
- Serviços de segurança
- Como: Definir a propriedade ProtectionLevel
- Especificação e Tratamento de Falhas em Contratos e Serviços
- Usando contratos de mensagem