Para empezar, quiero disculparme por lo pomposo del titulo de este post, pero en realidad es el mas acertado para lo que les voy a mostrar a continuación.
La idea es plantearles un problema al cual nos
enfrentamos recientemente y la solución al mismo, cuando tuvimos la necesidad
de asegurar un sistema de cobros que desarrollamos.
Por ser un sistema que manejaba dinero, el intercambio de información
con dicho sistema debía realizarse de manera confiable y segura.
Para implementar dicho sistema y de común acuerdo con
nuestro cliente, elegimos la plataforma de servicios Windows Azure, dadas todas
las facilidades que provee, aprovechando además que el cliente ya posee otros
sistemas implementados sobre la misma y está sumamente conforme.
La solución a entregar constaba de un sitio web en el cual
los usuarios de dicho sitio se autenticaran y pudieran ingresar pagos a
realizarse por clientes de la empresa.
Por detrás, ese sitio, debía comunicarse con un servicio que
le proveería de todas las operaciones que el sitio necesitara. Además, el servicio debía estar disponible para que otros
subsistemas pudieran obtener información del mismo.
La tecnología que elegimos para desarrollar el backend de
dicho sistema, fue WCF utilizando como enlace al mismo
NetTcpBinding, por su versatilidad y perfomance. Dado el escenario que teníamos planteado y la tecnología con
la que íbamos a desarrollar, solo nos restaba decidir como íbamos a asegurar
este sistema, siendo más especifico y en el caso particular que les quiero
plantear en este post, lo que nos quedaba por resolver era ¿Cómo asegurar las
comunicaciones con el servicio WCF?
Para contestar dicha pregunta, estuvimos evaluando las
diferentes alternativas para resolver la necesidad planteada en el contexto que
les expuse anteriormente.
(Todos sabemos que no existe la "solución
perfecta", sino la solución funcional sobre un escenario determinado).
En fin, llegamos a la conclusión de que en este caso utilizaríamos
un servicio que ya provee Windows Azure: Access Control Services.
Pero... ¿Qué es y para qué sirve Windows Azure Control
Services?
El servicio de Access Control (ACS para los amigos) pone a
disposición de los desarrolladores un sistema de identidad y control de acceso
a las aplicaciones y servicios. Está integrado con los proveedores de identidad
estándares, tanto a nivel enterprise (directorio activo), así como web (Yahoo,
Live Id, Google, facebook)
En pocas palabras… permite sacar de la aplicación las
decisiones de autorización y basarlas en reglas declarativas. ACS actuará como
una capa de abstracción para lidiar con los diferentes Identity Providers y
ofrecer a la aplicación un único formato de intercambio de tokens. Además nos permite establecer la relaciones de confianza entre nuestro servicio y el ACS así como el protocolo utilizado para la comunicación
Para los que hace años que desarrollamos en ambientes que
requieren altos niveles de seguridad, sabemos que este un tema duro, sobre todo
cuando nos enfrentamos a los expertos de seguridad de IT por éstos menesteres. :)
Ni hablar de siglas como ADFS, WS-Trust y federación.. Es un
lenguaje IT que difícilmente se escuche fuera de los círculos de expertos en el
área de seguridad.
Entonces y resumiendo un poco: la buena noticia es que si
bien ACS hace uso de todas estas especificaciones, APIs, herramientas, etc. no
es necesario que los desarrolladores nos volvamos expertos en seguridad para
entender y utilizar el Access Control Service. No hay que aprender ninguna de las tecnologías antes mencionadas, para el 80% de
escenarios de uso de Access Control Service no será necesario empaparnos de estas
especificaciones/herramientas/SDKs, simplemente consumiremos una serie de
servicios. Si querés saber más de ACS, éste es un buen lugar para
empezar: http://msdn.microsoft.com/library/windowsazure/hh147631.aspx.
Volviendo a lo nuestro
Dentro de las posibilidades que nos provee ACS para asegurar
las comunicaciones, nosotros elegimos certificados x.509.
¿Tenemos todo listo entonces? NO
La realidad es que, como suele suceder, los ejemplos para
este tipo de soluciones, no aplican 100% al escenario que estamos teniendo.
En nuestro caso, la dificultad es que estamos usando WCF con
un binding NetTcpBinding y certificados x.509 para comunicaciones seguras, sin mencionar el manejo de los token emitidos por el STS de ACS... un gran lío para lo cual no
hay una solución de ejemplo.
CONTINUARÁ...
En la próxima parte de este post te voy a contar como
hicimos para solucionar este problema. Mientras tanto y para que te vayas divirtiendo, te dejo unos
links para que leas...