Windows Communication Foundation é uma plataforma distribuída orientada a mensagens SOAP. Dentre suas principais características podemos destacar os recursos de segurança entre mensagens cliente/servidor. Atualmente tais recursos são essenciais para proteção dos nossos dados.
Dentre os recursos de segurança dos serviços WCF encontramos os níveis de proteção (protection levels) dos envelopes SOAP. Tais níveis de proteção são responsáveis por proteger a comunicação cliente/servidor contra interceptações e alterações indevidas.
Estes recursos são necessários para garantir a confidencialidade dos dados, prevenindo o extravio, a alteração ou a leitura dos dados por outros.
Atualmente, podemos fazer uso de três diferentes níveis de proteção, sendo eles:
– None: nenhum comportamento adicional é adicionado a esta configuração.
– Sign: o conteúdo é assinado digitalmente, assegurando a detecção de qualquer manipulação dos dados enviados.
– EncryptAndSign: o conteúdo é criptografado antes de ser assinado.
Fato importante: por padrão, o BasicHttpBinding não fornece recursos de segurança (embora isso possa ser configurado). Desta forma, qualquer nível de segurança diferente de None causará um estouro de exceção quando acionado. Assim, se definimos um nível de proteção Sign ou EncryptAndSign, somos obrigados a utilizar um binding com segurança habilitada, ou uma exceção será lançada.
Importante: Se você utilizar um binding cuja segurança esteja habilitada e no qual você não tenha definido o nível de proteção explicitamente, então todos os dados da aplicação serão criptografados e assinados. Assim como, se for utilizado um binding que não possui segurança habilitada e o nível de permissão não for definido explicitamente, nenhuma parte dos dados será protegida (http://msdn.microsoft.com/en-us/library/aa347692.aspx).
O nível de segurança pode ser definido em diferentes escopos, sendo eles:
– ServiceContractAttribute: a nível do contrato do serviço, assim todos os métodos do contrato terão o mesmo nível de segurança.
– OperationContractAttribute: a nível de método do serviço, desta maneira todos os dados trafegados por decorrência da execução do método do serviço deverão respeitar o nível de segurança definido.
– FaultContractAttribute: define o nível de segurança no qual as mensagens de falha devem trafegar.
– MessageContractAttribute: a nível de um tipo de dados.
– MessageHeaderAttribute & MessageBodyMemberAttribute: possível definição de um nível de segurança diferente para cada atributo de um tipo de dados.
Abaixo um exemplo de atribuição de no nível de proteção nos escopos de ServiceContractAttribute e OperationContractAttribute. Vale notar que estamos utilizando um nível específico de proteção para todos os métodos do serviço e um segundo nível de proteção (não obrigatório) para um método em específico, no qual queremos, além da assinatura, a criptografia dos dados.
using System.Net.Security; using System.ServiceModel; namespace WcfSecurity { [ServiceContract(ProtectionLevel = ProtectionLevel.Sign)] public interface ISecurityService { [OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)] [FaultContract(typeof(CustomServiceFault), ProtectionLevel = ProtectionLevel.Sign)] AccountInfo GetAccountsData(CustomerCredential credential); // Other methods... } }
Por
MSc. Fernando Henrique Inocêncio Borba Ferreira
Microsoft Most Valuable Professional – Visual C#
Referências:
Essential Windows Communication Foundation – Resnick, Crane, Bowen – Addison Wesley.
http://www.codeproject.com/Articles/318810/WCF-Service-Method-Level-Security-using-Message-Co
http://msdn.microsoft.com/en-us/library/aa347692.aspx
http://msdn.microsoft.com/en-us/library/aa347791.aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.faultcontractattribute.aspx
http://msdn.microsoft.com/en-us/library/ms735093.aspx
http://blogs.msdn.com/b/saurabs/archive/2012/05/15/wcf-interop-understanding-protection-level.aspx