Certificação Microsoft 70-487: Objetivo 3.4 – Secure a WCF service

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:

security mode

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á!