O objetivo 3.4 do exame, Secure a WCF service, cobre as features de segurança que o WCF disponibiliza. Isso inclui 1) como implementar segurança no nível de mensagem, 2) como implementar segurança no nível de transporte e 3) como implementar certificates, que é a combinação dos itens anteriores. Vamos lá?
Implementando Segurança no Nível de Mensagem
Basicamente, implementar segurança no nível da mensagem é “incrementar” as mensagens SOAP com 3 características CIA:
- Confidencialidade: significa que somente as pessoas que devem ver uma mensagem são as pessoas que de fato vejam a mensagem;
- Integridade: significa que a mensagem não pode ser alterada;
- Autenticação: garante a identidade de quem está vendo a mensagem.
Isso significa que a mensagem não é visualizada sem a chave correspondente, mas o texto criptografado pode ser visto na rede.
Na maioria dos bindings, isso é feito por padrão e roda transparentemente, sem intervenção do desenvolvedor. Você pode também especificar via código ou arquivo de configuração.
Por código, basta setar a propriedade Security.Mode do binding desejado, seja por construtor ou setando a propriedade manualmente:
// Set Security Mode to Message in Constructor
WSHttpBinding WsHttpSecurity = new WSHttpBinding(SecurityMode.Message);
// Set the Security property manually
WSHttpBinding wsHttpSecurity2 = new WSHttpBinding();
wsHttpSecurity2.Security.Mode = SecurityMode.Message;
A propriedade Mode para o wsHttpBinding é do tipo SecurityMode. Para o basicHttpBinding o tipo é BasicHttpSecurityMode e para o netNamedPipeBinding é NetNamedPipeSecurityMode.
É possível fazer essa configuração no arquivo de configuração pelo WCF Service Configuration Editor. Para cada binding configurado, há duas abas no editor: Binding e Security. Basta ir na aba Security e setar o Mode para Message:
Se você for para o arquivo de configuração, verá que nada foi adicionado pois o wsHttpBinding faz essa segurança por padrão. Contudo, é possível declarar também explicitamente dessa forma:
<wsHttpBinding>
<binding name="wsHttpBindingConfigSample" >
<security mode="Message"/>
</binding>
</wsHttpBinding>
Implementando Segurança no Nível de Transporte
Transporte seguro significa que todo o transporte é criptografado, tornando difícil para um interceptor compreender a mensagem. Com isso, o texto da mensagem não precisa ser criptografado; pode ser trafegado em plain text.
Implementar segurança no nível de transporte é virtualmente idêntico ao item anterior. A diferença é que, ao invés de setar o Mode como Message, você deve escolher Transport ou TransportWithMessageCredential
Seja via código ou arquivo de configuração, o funcionamento é exatamente o mesmo.
Implementando Certificates
Para usar certificados, você precisa adicionar uma referência a System.Security.dll. Com o certificado instalado, a configuração no WCF é bem simples.
Assumindo que você tenha um netHttpBinding configurado para o serviço, basta sincronizar os elementos <security> e <message> para que o Mode da propriedade Security seja TransportWithMessageCredential e a propriedade ClientCredentialType da mensagem seja o certificado.
Após essa configuração, basta garantir que certificado está instalado no client, obter uma referência a ele e adicioná-lo na propriedade Credentials.ClientCredentials.Certificate:
var MyFactory = new ChannelFactory
MyFactory.Credentials.ClientCredentials.Certificate = X509.CurrentUser.My.SubjectDistinguishedName.Find("CN=CLIENT").FirstOrDefault();
Isso é tudo para esse objetivo 🙂 O próximo post será sobre o objetivo 3.5, Consume WCF services.
Até lá!