Securizar una aplicación nativa con WAAD

En este post veremos cómo es posible securizar una aplicación nativa que haga uso de WAAD, así como ver cómo es posible que ésta haga una llamada a un servicio Web API que también está securizado con WAAD. Las dos aplicaciones hacen uso del mismo tenant de Windows Azure.

Básicamente el ejemplo es prácticamente igual que los que veíamos meses atrás con ACS, con el principal cambio de que ya hay versión definitiva de la librería cliente de WAAD; Active Directory Authentication Library (ADAL).

Securizar aplicaciones Windows 8 con ACS y WAAD

Securizar aplicaciones Windows Phone 8 con ACS

En este ejemplo he creado una nueva aplicación WPF y el añadido el paquete de nuget de Active Directory Authentication Libray.

01-WAAD_WPF

Una vez tenemos la aplicación creada, desde el portal de Windows Azure tenemos que dar de alta una nueva aplicación en nuestro tenant de WAAD. En este caso, creamos una nueva aplicación nativa.

02-WAAD_WPF

Además de darle un nombre deberemos indicar una URI válida, que como dice en la información no tiene por qué ser real, pero si una URI válida. Este valor lo usaremos posteriormente en el código cliente que escribamos.

03-WAAD_WPF

Así mismo, una vez creado veremos otro dato importante que necesitaremos, el ClientID.

Al inicio del post también comentábamos que queremos que esta aplicación pueda hacer llamadas a nuestro servicio Web API, securizado también con WAAD. Pues bien, en la sección Web APIs indicaremos que queremos que esta aplicación nativa pueda acceder al servicio de Web API, tan fácil como eso.

 

04-WAAD_WPF

Una vez creada, tendremos que crear el código para que el usuario pueda autenticarse en la aplicación, conseguir un token de seguridad y hacer la llamada REST.

El siguiente código es el código necesario para conseguir un token de seguridad. Al llamar a AcquireToken se le mostrará al usuario la pantalla para que pueda autenticarse. Si la autenticación es correcta, podemos conseguir un token de seguridad haciendo uso del método CreateAuthorizationHeader.

05-WAAD_WPF

06-WAAD_WPF

 

Y una vez conseguido el token, sólo tenemos que enviarlo en las cabeceras de autenticación de las peticiones que hagamos.

 

05.1-WAAD_WPF

Securizar Web API con WAAD

Hace ya tiempo hablé de como securizar una aplicación Web API con ACS. En ese post se usaba un DelegationHandler para validar en todas las peticiones que el cliente que realiza la llamada envie un token de seguridad válido en las cabeceras de autenticación. Ese post es completamente válido y podría usarse esa misma aproximación con Windows Azure Active Directory.

Es válido, pero si usamos las plantillas y el código que genera Visual Studio 2013, veremos otra opción mucho más simple, que no es otra que usar OWIN para establecer la seguridad. Vamos a verlo.

Si seleccionamos crear un nuevo proyecto web, indicaremos que queremos crear una aplicación Web API, indicando a su vez que queremos usar nuestro tenant de WAAD para disponer de una aplicación Single-tenant. Los pasos son exactamente los mismos que veíamos en el post anterior dónde hablábamos de una aplicación MVC.

02-WAAD_WebAPI

 

Una vez creado, añadiremos la atribute [Authorize] en aquellos controladores que queremos securizar.

04-WAAD_WebAPI

Una vez hecho esto, podemos ejecutar la aplicación (F5) e intentar realizar una petición GET a “api/values”. En este momento veremos cómo NO podemos hacer la petición y recibiremos en un error de autenticación.

Tened cuidado no estéis ya autenticados! Que entonces sí funcionará. Si en el ejemplo de MVC le distéis a recordar contraseña es posible que estéis autenticados y por tanto, esta petición os devuelva resultados.

03-WAAD_WebAPI

En el caso de la aplicación MVC os comentaba que era en el fichero de configuración dónde se establecía la configuración para indicar que queríamos usar WAAD. En este caso, se usa OWIN…aquí vemos el código que hace posible que el servicio Web API esté securizado.

En el proyecto Web API veremos una clase Startup.cs la cuál se usa para configurar todos aquellos módulos basado en OWIN. El nombre de esta clase es una convención, si arrancamos el proyecto y ponemos un punto de parada veremos cómo se ejecuta de forma automática el código de este clase.

05-WAAD_WebAPI

Si vamos al método ConfigureOAuth, veremos cómo se establece la seguridad…fácil, no?

06-WAAD_WebAPI

07-WAAD_WebAPI

 

Una aplicación cliente (WPF, Windows Store, WP…) que quiera hacer uso de este servicio tendrá que disponer de un token de seguridad válido y enviarlo en las cabeceadas de autenticación, tal y como veremos en el siguiente post.

Más fácil imposible!

Desplegar en Azure una aplicación MVC con WAAD

En el post anterior veíamos cómo crear una aplicación ASP.NET Web y cómo securizarla con WAAD. En este post veremos cómo desplegar en Azure Web Sites.

El primer paso es crear un servicio de Web Sites, ya sea desde el portal de Windows Azure o directamente desde Visual Studio, desde el Server Explorer.

08-WAAD_MVC

Seleccionando la opción de Web Sites podemos crear un nuevo Web Site, que es dónde desplegaremos la aplicación Web creada anteriormente. En este paso es necesario también indicarle que hay que crear una base de datos, ya que la aplicación creada en el paso anterior hace uso de una base de datos para el mantenimiento de la información del tenant. Echadle un ojo al fichero de configuración para verlo.

09-WAAD_MVC

Una vez creado, lo que podemos hacer es descargarnos el perfil de publicación, el cuál contiene todos los datos para poder publicar la aplicación web directamente desde Visual Studio.

10-WAAD_MVC

Una vez descargado el perfil, podemos seleccionar la opción “publish” e importa el perfil recién descargado.

11-WAAD_MVC

En este punto fijaron que está activada la opción de usar seguridad corporativa. Tal y como veíamos en el paso anterior, el propio proceso de publicación será el encargado de crear una aplicación en el tenant de WAAD, para securizar la aplicación que desplegemos.

Si no lo tenéis rellenado por defecto, en este punto es importante que podáis la cadena de conexión a la base de datos.

12-WAAD_MVC

y nada, tras unos minutos tendremos ya la aplicación desplegada en Azure Web Sites! Se nos abrirá el navegador, se nos pedirá las credenciales de autenticación si no estamos ya autenticados, y veremos nuestra aplicación web tal y como lo hacíamos en el caso anterior.

Como en el caso anterior, si vamos al portal de Windows Azure veremos cómo se nos ha creado una nueva aplicación en el tenant de WAAD.

13-WAAD_MVC

14-WAAD_MVC

15-WAAD_MVC

Por supuesto, podríamos haber creado nosotros mismo la aplicación desde el portal de Windows Azure. En el portal dando a la opción de añadir poder crear fácilmente una aplicación, para securizar aplicaciones Web o para securizar aplicaciones nativas como Windows Store, WPF o Windows Phone.

En el wizard indicaremos el nombre, “App ID” único, la URL dónde estará etc…Así como el tipo de acceso que queremos dar. Por ejemplo, podemos controlar si la aplicación podrá hacer uso de los servicio REST para leer o modificar los objetos (usuarios, grupos…) de nuestro tenant.

19-WAAD_MVC

20-WAAD_MVC

21-WAAD_MVC

Securizar aplicaciones MVC con WAAD

En post anteriores veíamos cómo crear un tenant de Windows Azure Active Directory para disponer de este servicio de identidad en la nube. En este post toca ver cómo podemos usar este directorio para securizar una aplicación Web, este caso una aplicación MVC.

Una vez que hemos seleccionado la opción de crear un nuevo proyecto web, seleccionaremos la opción de generar una aplicación MVC. En la parte derecha del formulario vemos un botón (Change Authentication) el cuál nos permitirá configurar de forma fácil qué tipo de seguridad queremos aplicar.

02-WAAD_MVC

Entra las diferentes opciones que existen, vemos una que nos permitirá usar de forma fácil WAAD; Organizational Accounts.

Una vez hemos seleccionado esta opción podremos configurar cómo será nuestra seguridad…si será una aplicación que use un único directorio (single-tenant), si tendrá varios (multi-tenant) o incluso si en lugar de usar un directorio de WAAD en la nube queremos usar cualquier otro que podamos tener on-premise, otro STS que podamos tener nosotros.

En este punto tenemos que indicar el nombre de nuestro tenant, el cuál creamos en el post anterior.

Si no proporcionamos un “App ID”, el wizard de creación del proyecto creará uno por nosotros de forma automática, con la URL dónde se hostea en local la aplicación web.

03-WAAD_MVC

Una vez establecemos estas opciones, podemos ya darle a crear el nuevo proyecto. Durante el proceso de creación se nos pedirá introducir las credenciales de administrador de nuestro tenant de WAAD, ya que este proceso crea una nueva aplicación en nuestro tenant.

Recordad, que por cada aplicación que queremos securizar, tenemos que dar de alta una nueva aplicación en el tenant. La aplicación la podemos dar de alta nosotros manualmente e introducción el “App ID” en el wizar de creación o dejar que sea el wizard el que lo haga por nosotros.

04-WAAD_MVC

El resultado de este proceso será que tendremos un nuevo proyecto MVC pero securizado con WAAD. Si os interesa indigar un poco más, podéis echar un ojo al fichero de configuración de la aplicación Web para que veáis las entradas que hay añadidas y que son las que indican que la aplicación va securizada con WAAD, todo en el fichero de configuración.

Si vamos al portal de Windows Azure veremos en la sección de aplicaciones una nueva aplicación que ha sido creada durante el proceso de creación del proyecto web.

05-WAAD_MVC

Si ejecutamos la aplicación en local (F5), veremos que se nos piden las credenciales de nuestro tenant. Esta página no es de nuestra aplicación, ya que la aplicación NO autentica, quien autentica es nuestro proveedor de identidad en la nube, es decir, Windows Azure Active Directory. Una vez que la autenticación es correcta, se nos redirige a nuestra aplicación.

Si indicamos unas credenciales válidas, veremos nuestra aplicación web con la plantilla por defecto que genera Visual Studio. En la parte superior derecha veremos el nombre del usuario autenticado, lo mismo que si estuviéramos usando autenticación Windows o autenticación basada de formularios.

Lógicamente, si tuviéramos más de una aplicación web y accedemos a ella o si estuviéramos ya autenticados, no se nos volverían a pedir las credenciales.

06-WAAD_MVC

07-WAAD_MVC

Cómo crear un tenant de Windows Azure Active Directory

Como veremos a continuación, crear un tenant de WAAD no es para nada complicado y lo podremos hacer de forma fácil a través del portal de Windows Azure.

El único aspecto que hay que tener en cuenta es que cada tenant de WAAD va asociado al usuario con el que sea crea el tenant, no a la subscripción, y que cada usuario sólo puede tener un único tenant, el cuál no lo puede eliminar una vez creado.

El último aspecto a tener en cuenta, es que si dispones de una cuenta de Office 365, ya dispones de un tenant de WAAD, porque como comenté en el post anterior Office 365 usa WAAD. Si disponemos ya de una cuenta, seguramente nos interesa usar este tenant para que podamos tener Single Sign On entre los diferentes servicios que tenga en Office 365 con las aplicaciones que pueda desplegar en la nube y que hagan uso de WAAD.

Una vez estamos en el portal, podremos acceder a la sección Active Directory desde la cuál podemos crear un tenant.

01-WAAD

Si seleccionamos la opción de crear un tenant, podremos elegir entre crear un nuevo directorio (tenant) o usar uno ya existente de Office 365.

02-WAAD

Si creas uno nuevo tienes que proveerle de un nombre único, así como de la ubicación del mismo.

El nombre que se pone es importante, ya que todas las cuentas de los usuarios de ese directorio dispondrán de ese nombre en sus direcciones de correo…claro está, el servicio también permite usar dominios personalizados para evitar el uso de estos nombres…estoyenlanube.onmicrosoft.com

03-WAAD

Si seleccionamos usar un propio, para reutilizar el de Office 365, nos pedirá que hagamos un logout y que nos autentiquemos en el portal de Office 365 con una cuenta de administrador global, para que a partir de ese momento podamos ver el tenant de Office 365 en el portal de Windows Azure.

NO estamos creando un nuevo, sólo haciendo que el tenant de Office 365 se vea en el portal de Windows Azure…si en Office 365 tenemos ya usuarios o está sincronizado con un entorno on-premise, veremos toda esta configuración desde el portal de Azure…porque es el mismo!

04-WAAD

Una vez creado, lo podemos ver en el listado de directorios y no podremos crear otro asociado al mismo usuario.

06-WAAD

Yo lo que hago es usar diferentes LiveIds para crearlos, pero siempre el siguiente paso es añadir mi LiveID habitual como administrador de todos los tenant que he creado, así como un LiveId puede administrador todos fácilmente.

Adicionalmente, puede crear usuarios del directorio. Puede crearlos aquí directamente o podría sincronizarlo con un Active Directory on-premise.

 

07-WAAD

08-WAAD

09-WAAD

Y una vez que tenemos el tenat y los usuarios creados, ya podemos empezar a securizar aplicaciones; MVC, Web API, Windows Store, Windows Phone, WPF etc…Lo que queramos! Para siguientes post…

Windows Azure Active Directory

En post anteriores he intentado mostrar de forma detallada el funcionamiento de Windows Azure ACS y de Windows Azure Active Directory, viendo cómo es posible utilizar estas dos tecnologías para securizar aplicaciones MVC, WebAPI u otro tipo de aplicaciones como aplicaciones Window Store o Windows Phone.

Desde que escribí esos post ha pasado ya tiempo, unos meses, y el avance que ha tenido Windows Azure Active Directory ha sido bastante, por lo que he decidido escribir algún post adicional que muestre el funcionamiento de WAAD con aplicaciones Web, ya que sin lugar a dudas WAAD más tarde o más temprano terminará sustituyendo completamente a ACS, el cuál tiene los días contados. A día  de hoy no WAAD no ofrece lo mismo que ACS, pero seguro que lo tendrá.

Para aquellos que no lo conozcan, Windows Azure Active Directory (WAAD) es un servicio moderno basado en REST que ofrece funciones de administración de identidad y control de acceso para las aplicaciones en la nube. Utilizando este servicio podremos securizar fácilmente todo tipo de aplicaciones ( Web, WP, Windows Store, .NET, Java…), delegando toda la lógica de autenticación en WAAD, simplificando por tanto el código de nuestras aplicaciones. Veremos lo fácil que es, por ejemplo, disponer de entornos de Single Sign On entre aplicaciones, las cuáles podría estar desplegadas en cualquier entorno, ya sea Windows Azure, un entorno on-premise o en aquel punto que más rabia nos de.

Como seguro que todos ya sabéis, en entornos corporativos es muy habitual el uso de Active Directory a nivel corporativo. Las empresas utilizan Active Directory para proveer de una identidad única a sus empleados, utilizando esta identidad para todas las operaciones que requieren securidad dentro de la empresa; acceso a su ordenador, acceso al SharePoint corporativo, a las aplicaciones desplegadas en tu propio entornos etc…es decir, Active Directory nos permite disponer de un directorio corporativo común, simplificando enormemente la gestión de la identidad.

Pero claro, cada vez existen más servicios en la nube que son realmente útiles para la empresa, por ejemplo Office 365, SharePoint, aplicaciones desplegadas en Windows Azure o cualquier otro servicio ofrecido como SaaS que podemos encontrar a día de hoy….¿Cómo gestionamos la identidad? El Active Directory corporativo ya no parece una alternativa, ya que las aplicaciones que he comentado exceden los límites de la empresa y por tanto parece que puede haber un gran riesgo de fragmentar ese directorio común que habíamos conseguido con Active Directory, haciendo más complicada la gestión de la identidad.

Pues aquí surge Windows Azure Active Directory! el cuál nos va permitir seguir disponiendo de ese directorio común, independientemente de dónde estén desplegadas nuestras aplicaciones.

WAAD noes más que un servicio de identidad y directorio en la nube y por ejemplo, en el servicio en el que se basa de toda la seguridad de Office 365, el cuál soporta millones de autenticación por minutos sin despeinarse 🙂 Y términos más técnicos, podemos decir que WAAD no es más que un Secure Token Service (STS) que puede actuar de proveedor de identidad en nuestras aplicaciones.

En cuanto a la gestión de directorio, WAAD nos permitirá crear y gestionar nuestros usuarios sin disponer de un Active Directory on-premise o lo que puede ser más interesante es muchas empresas, nos permitirá sincronizar nuestro directorio local con nuestro directorio en la nube….el mismo usuario que usamos para conectarnos a nuestro equipo, podremos usarlo para conectarnos a nuestra aplicaciones desplegada en Windows Azure, todo ello con Single Sign On…para los usuarios es completamente transparente dónde están las aplicaciones.

Claro está, como buen STS, está basado completamente en protocolos estándares, lo cuál va a permitir que podamos trabajar con WAAD y aplicaciones .NET, o cualquier otra aplicación hecha en cualquier otro lenguaje.

 

Purpose

Details

REST/HTTP directory access

Create, Read, Update, Delete directory objects and relationships

Compatible with OData V3

Authenticate with OAuth 2.0

OAuth 2.0

Service to service authentication

Delegated access

JWT token format

SAML 2.0

Web application authentication

SAML 2.0 token format

Used with Office 365 Services

WS-Federation 1.3

Web application authentication

SAML 1.1 token format

Used with Office 365 Services

Por último, otra de las cosas interesantes de este servicio es que dispone de un servicio REST ( Windows Azure AD Graph  API ) a través del cuál es  posible realizar cualquier operación de lectura o modificación sobre los diferentes objetos disponibles en Windows Azure Active Directory; usuarios, grupos etc…algo similar a lo que se podría hacer con ADSI o ADO.NET en un entorno on-premise de Active Directory.

En los próximos post veremos cómo crear un servicio de WAAD e iremos viendo paso a paso cómo securizar aplicaciones Web, tanto MVC como WebAPI.