6.17.2012

Autenticando Servicios WCF – Certificados Digitales–Parte 2

En el post anterior empezamos creando el certificado digital e instalándolo de forma tal que pueda ser utilizado para autenticar un cliente a la hora de consumir un servicio utilizando WCF. Ahora vamos a proceder a crear un servicio que utilice este certificado como medio de autenticación.

Creando el Servicio WCF que Utiliza el Certificado Digital

Para iniciar vamos a crear un servicio WCF con la plantilla de proyecto “WCF Service Library”.

image

Ahora vamos a crear un contrato de servicio con una simple operación que suma dos número –> la complejidad del servicio no es relevante, incluso pudimos utilizar el servicio pre generado.

using System.ServiceModel;

namespace ServicioSeguroBlog
{
[ServiceContract(Namespace="http://www.formsevolution.com")]
public interface IServicioSeguro
{
[OperationContract]
int Sumar(int pX, int pY);
}
}


Y procedemos a implementar el servicio

namespace ServicioSeguroBlog
{
public class ServicioSeguro : IServicioSeguro
{
public int Sumar(int pX, int pY)
{
return pX + pY;
}
}
}

Ahora procedemos a configurar el servicio de forma tal que pueda utilizar el certificado para la autenticación. El primer paso es definir un “binding” para establecer como se va a manejar la seguridad en el endpoint, esta seguridad se define por tipo de protocolo a utilizar –> podemos tener múltiples configuraciones para cada binding ya que siempre los podemos identificar vía el nombre. Como se puede ver en el siguiente código, en este binding vamos a utilizar seguridad a nivel de mensaje y el tipo de credencial a utilizar será certificado.

<bindings>
<
wsHttpBinding>
<
binding name="wsHttpEndpointBinding">
<
security>
<
message clientCredentialType="Certificate" />
</
security>
</
binding>
</
wsHttpBinding>
</
bindings>

El siguiente paso es modificar el comportamiento estándar definido para el endpoint por parte de la plantilla de WCF para establecer como se van a manejar los certificados a la hora de autenticar. En primera instancia, al estar utilizando un certificado temporal tenemos que habilitar el revocationMode. Seguidamente configuramos el certificado a nivel de servicio para indicarle el nombre de mismo, su ubicación, y el nombre del almacén que lo contiene.

        <behavior>
<
serviceMetadata httpGetEnabled="True"/>
<
serviceDebug includeExceptionDetailInFaults="False" />
<
serviceCredentials>
<
clientCertificate
>
<
authentication revocationMode="NoCheck"
/>
</
clientCertificate
>
<
serviceCertificate findValue="CN=DRMCert" storeLocation="LocalMachine" storeName="My"
/>
</
serviceCredentials
>
</
behavior>

Por último procedemos a “ligar” el endpoint del servicio con los ítems configurados anteriormente.

      <service name="ServicioSeguroBlog.ServicioSeguro">
<
host>
<
baseAddresses>
<
add baseAddress = "http://localhost:8732/Design_Time_Addresses/ServicioSeguroBlog/Service1/" />
</
baseAddresses>
</
host>
<
endpoint address ="" bindingConfiguration="wsHttpEndpointBinding" binding="wsHttpBinding" contract="ServicioSeguroBlog.IServicioSeguro">
<
identity>
<
dns value="localhost"/>
</
identity>
</
endpoint>
<
endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</
service>

A nivel del comportamiento no es necesario agregarle nada ya que el servicio utiliza el que esta definido por defecto, por lo tanto solo tenemos que agregar el binding el cual hacemos a través de la etiqueta bindingConfiguration. Ahora procedemos a instalar el servicio en el IIS.


Antes de instalar el servicio podemos probar que este este funcionando correctamente con el host temporal de VS 2010 –> svcHost. Si el servicio carga esta bien configurado.


image


Sin embargo, si lo ejecutamos debe de fallar ya que el cliente de prueba auto configurado no tiene la información del certificado para autenticarse.


image


Para instalar el servicio, hacemos una aplicación web dentro del IIS


image


Seguidamente creamos un Application Pool que tenga un usuario que tenga permisos para acceder al certificado, en mi caso es usuario local –> Local System.


image


Luego procedemos a asignar ese pool a la nueva aplicación web.


image


El siguiente paso es instalar el servicio en la nueva aplicación creada en el IIS. Esto se hace seleccionado la opción de publicar el servicio.


image


El VS nos dirá si la instalación estuvo correcta o no.


image


Si habilitamos el directory browsing y vamos a la dirección del servicio vamos a ver el contenido del directorio.


image


si le damos click al archivo svc veremos la presentación del servicio y ahí podemos seleccionar ver el wsdl del servicio.


image




Configurar el Cliente


El último paso es configurar el cliente. Para esto vamos a crear una aplicación de consola que va a consumir el servicio. El primer paso es agregar la referencia al servicio con la dirección del WSDL.


image


Seguidamente procedemos a codificar la invocación a la operación.


 

using System;
using ClienteSeguro.ReferenciaServicio;

namespace ClienteSeguro
{
class Program
{
static void Main()
{
using (var _proxy = new ServicioSeguroClient())
{
var _resultado = _proxy.Sumar(3, 5);
Console.WriteLine(_resultado);
}
}
}
}

El siguiente paso es configurar el cliente para que pueda autenticarse con el certificado. Primeramente procedemos a agregar el comportamiento del lado del cliente para que el cliente sepa donde esta el certificado a utilizar. En este caso será igual del servicio porque estamos haciendo el ejercicio en la misma máquina, en situaciones reales hay que instalar el certificado en el cliente e indicar en la configuración en donde se encuentra este certificado.

  <system.serviceModel>
<
behaviors>
<
endpointBehaviors>
<
behavior name="BehaviorNuevo">
<
clientCredentials>
<
clientCertificate findValue="CN=DRMCert" storeLocation="LocalMachine" storeName="My" />
<
serviceCertificate>
<
authentication revocationMode="NoCheck"/>
</
serviceCertificate>
</
clientCredentials>
</
behavior>
</
endpointBehaviors>
</
behaviors>








Por último agregamos el comportamiento al endpoint del servicio.

      <endpoint address="http://diego-pc.cgccr.priv/WCFCertificados/ServicioSeguroBlog.ServicioSeguro.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServicioSeguro" behaviorConfiguration="BehaviorNuevo"
contract="ReferenciaServicio.IServicioSeguro" name="WSHttpBinding_IServicioSeguro">
<
identity>
<
certificate encodedValue="AwAAAAEAAAAUAAAALKVZNNCYWPMn+f6f4SfBghH+PcIgAAAAAQAAAOwBAAAwggHoMIIBVaADAgECAhBZhs7Ez8SQt0Ud2V9N1dnOMAkGBSsOAwIdBQAwEjEQMA4GA1UEAxMHUm9vdERSTTAeFw0xMjA1MTYxNzQyMjBaFw0zOTEyMzEyMzU5NTlaMBIxEDAOBgNVBAMTB0RSTUNlcnQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALG6+TrqsTKkBSNpfbpKHQGzdV8poX7+0fMf5/3jdrkFz1FnfZ7VmmMPIxdNuYJv63B2ScofpZEyvOfw61DHvjShORUSk3kw5NUW40hpVx4KUSneJjcvXklIHdODUfsCy7Werx30Q0CsgfydtCzJkKYLCuT3WVFxHeIqjNRFzIuzAgMBAAGjRzBFMEMGA1UdAQQ8MDqAEEPdF141cN5jkiYGrl1aJRChFDASMRAwDgYDVQQDEwdSb290RFJNghBrRb3C05OyokfF03CEBc6QMAkGBSsOAwIdBQADgYEAl+fRGhfd/gxgmtDLUFJ2UnAPII6lslW5hMeSs/VPXpCafoOzJSfBV3NPXMslTHKgRrBfuRwcf3ruID5Ttas5n1JPfvzn7TYqVDQ+vU2rOt0A19FAMMGJBW9Q934NxRVwPSR6Yklpunozb3EFg/YdVTcBbrr658wKN/O8hrGl+IM=" />
</
identity>
</
endpoint>

Si ejecutamos el cliente anterior el resultado es el siguiente:


image


Etiquetas de Technorati: ,

1 comentario:

Raúl Berneri dijo...

Esta confuso. La aplicacion no esta creando un archivo .svc que luego invocas. Funciona esto mismo para IIS 5.1?