ASP.NET MVC Preview 4 (Parte 1)

El equipo de ASP.NET MVC está en la fase final de terminar la nueva Preview 4 que esperan publicar al final de esta semana. La Preview 3 se centró en finalizar un montón de trabajo en el núcleo de las apis y en puntos de extensibilidad en ASP.NET MVC. A partir de esta Preview 4 de esta semana empezarán a aparecer nuevas características de más alto nivel que se construirán encima del núcleo y añadirán una mayor productividad.

Hay un montón de nuevas características y capacidades en esta nueva build – tantas que en realidad necesito dos post para cubrirlas todas. En este primer post veremos el nuevo sistema de Caching, Gestión de Errores y Seguridad, así como algunas mejoras para realizar test. El próximo post versará sobre las nuevas características AJAX que se han añadido con esta release. Continúa leyendo ASP.NET MVC Preview 4 (Parte 1)

Autenticación en WCF

Gracias a una duda en la lista de correo del Club .Net de Sevilla vamos a ver cómo funciona esto de la autenticación en WCF.

Os recomiendo que os leáis un poco la documentación que hay en MSDN sobre WCF, y que os descarguéis los ejemplos que están disponibles aquí. Son muy pero que muy completos, y muestran casi cada característica de WCF.

Lo que vamos a ver es sobre cómo poder autenticar a un usuario con un login y password. El ejemplo que trata este caso en concreto lo tenéis aquí. En el ejemplo, se usa un binding wsHttpBinding, está muy bien, todo perfecto. Pero lo que no queda claro es que la credenciales del login y password viajan cifradas por la red. Todo para evitar sniffers, ataques man-in-the-middle, etc…

El pero es que necesitamos un certificado que permita esa seguridad, que como se dice en el ejemplo, al definir la autenticación por Username a nivel de mensaje:

Con esta configuración, lo que no queda claro, es que las credenciales y todo el tráfico va cifrado a nivel de transporte. Pero para eso nos hace falta un certificado que el servicio usará para: 

  1. Autenticarse a los clientes.
  2. Cifrar las comunicaciones a nivel de transporte.

En los ejemplos nos indican cómo generar un certificado para pruebas. Esto lo tenemos en los archivos Setup.bat y clean.bat junto a los archivos de solución de VS. Esos archivos usan unas herramientas disponibles para XP, Vista, Server 2003 y 2008, etc. Para XP podéis descargarlo aquí.

Este certificado no es confiable, ya que está firmado por nosotros mimos como entidad certificadora. Esto tiene sus ventajas e inconvenientes. Ventajas de cara a la seguridad (siempre incómoda pero necesaria, que luego pasa lo que pasa) y los inconvenientes es que no es barato. Pero bueno, lo importante es que necesitamos un certificado x509 (de esos).

Lo importante que no se dice en la documentación pero que si se ve en el código de los ejemplos, es que tenemos que indicar cuál es el certificado que nuestro servicio WCF va a usar. Una vez ejecutado el setup.bat y si vemos la palabra succeedd podemos continuar:

¿Por donde iba?.. Ah si. Tenemos que indicar el certificado que va a usar el servicio. Esto se hace en la sección de ServiceCredentials:

Ya tenemos un servicio que usa un certificado para autenticarse y cifrarse, muy bien. Pero quién se va a fiar de un certificado que no está firmado por Verisign? ¿Yo? No debería, ya que entonces la seguridad que le estamos metiendo es “pa na”. Quiero decir, que a la hora de hacer esto y poner un sistema en producción debemos contar con un certificado bueno, de pata negra. Aquí estamos viendo sólo cómo se hace para un entorno de desarrollo.

La falla de seguridad está en que podemos decirle a la aplicación cliente que no se fíe de este tipo de certificados. Por defecto, cuando agregamos una referencia a un servicio wcf con certificados con Visual Studio, la configuración que nos planta es que no va a aceptar certificados que no estén firmados por autoridades de confianza (como Verisign).

Esto es lo que me estaba fallando y lo que originó la serie de preguntas y respuestas en la lista de correo del Club .Net de Sevilla. Si nos vamos al App.Config de la aplicación cliente podemos cambiar ese comportamiento, y decirle a la aplicación cliente que confíe en estos certificados, esto lo hacemos de la siguiente forma:

Si nos vamos al App.Config del cliente que viene en el ejemplo, lo vemos. Además tenemos que decirle al endpoint del cliente que use este behavior:

Y ya está. A runear.

Espero que seáis más listos que un servidor (que no tiene certificación alguna) y no necesitéis esto.

Espero que sirva.

Juan María.