Autentica a tus usuarios en tus aplicaciones con Azure Active Directory

Si llevas tiempo desarrollando, ya conoces los diferentes mecanismos para autenticar usuarios en tus aplicaciones: bases de datos, Active Directory, a través de la autenticación que ya hace Windows, a través de redes sociales, etcétera. En este post me gustaría contarte cómo puedes delegar la gestión y la autenticación de tus usuarios en Azure Active Directory de una forma muy sencilla (¡este se puede sincronizar con un Active Directory!).

Para este ejemplo, voy a crear una aplicación con la plantilla de ASP.NET MVC para tener algo con lo que jugar. Del mismo modo esto me servirá para explicarte cuáles son las piezas que genera y cómo puedes integrarlo en tu aplicación, si es que ya la tienes creada. Antes de confirmar que MVC es la plantilla que quieres utilizar, selecciona la opción Change Authentication.

ASP.NET MVC – Change Authentication

Al hacer esto podrás ver las diferentes opciones que te ofrece Visual Studio para integrarte con diferentes tecnologías. Para este caso necesitas seleccionar Work or School Accounts.

Change Authentication – Work or School Accounts – Cloud

Si ya estás autenticado en Visual Studio con una o varias suscripciones de Microsoft Azure aparecerán todos los Azure Active Directories a los cuales te puedes conectar. Selecciona con el que quieres hacer la prueba y acepta los ajustes para que la aplicación se genere.

Los cambios realizados son los siguientes: si entras en el archivo web.config podrás comprobar que tienes una serie de propiedades en el apartado AppSettings prefijadas como ida:, que se corresponden con tu directorio:

  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <add key="ida:ClientId" value="YOUR_CLIENT_ID" />
    <add key="ida:AADInstance" value="https://login.microsoftonline.com/" />
    <add key="ida:ClientSecret" value="YOUR_CLIENT_SECRET" />
    <add key="ida:Domain" value="YOUR_DOMAIN.onmicrosoft.com" />
    <add key="ida:TenantId" value="YOUR_TENANT_ID" />
    <add key="ida:PostLogoutRedirectUri" value="https://localhost:44396/" />
  </appSettings>

Por otro lado, en el archivo App_Start/Startup.Auth.cs queda configurada la autenticación usando dichos valores.

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Globalization;
using System.IdentityModel.Claims;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.OpenIdConnect;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Owin;
using AADDemo.Models;

namespace AADDemo
{
    public partial class Startup
    {
        private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
        private static string appKey = ConfigurationManager.AppSettings["ida:ClientSecret"];
        private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
        private static string tenantId = ConfigurationManager.AppSettings["ida:TenantId"];
        private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];

        public static readonly string Authority = aadInstance + tenantId;

        // This is the resource ID of the AAD Graph API.  We'll need this to request a token to call the Graph API.
        string graphResourceId = "https://graph.windows.net";

        public void ConfigureAuth(IAppBuilder app)
        {
            ApplicationDbContext db = new ApplicationDbContext();

            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

            app.UseCookieAuthentication(new CookieAuthenticationOptions());

            app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions
                {
                    ClientId = clientId,
                    Authority = Authority,
                    PostLogoutRedirectUri = postLogoutRedirectUri,

                    Notifications = new OpenIdConnectAuthenticationNotifications()
                    {
                        // If there is a code in the OpenID Connect response, redeem it for an access token and refresh token, and store those away.
                       AuthorizationCodeReceived = (context) => 
                       {
                           var code = context.Code;
                           ClientCredential credential = new ClientCredential(clientId, appKey);
                           string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
                           AuthenticationContext authContext = new AuthenticationContext(Authority, new ADALTokenCache(signedInUserID));
                           AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
                           code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, graphResourceId);

                           return Task.FromResult(0);
                       }
                    }
                });
        }
    }
}

Para que todo esto funcione, además, es necesario crear una aplicación dentro de tu Azure Active Directory. Cuando enlazas tu aplicación durante la creación a tu directorio, esta se crea de manera transparente para ti. Para verla puedes acceder a https://portal.azure.com, busca en el menú lateral la sección Azure Active Directory y selecciona el apartado Enterprise applications.

AAD – Enterprise applications

Una vez allí, selecciona la opción All applications y verás el listado de todas las que tienes dadas de alta y, en concreto, la que el asistente de Visual Studio acaba de generar por tí, que se llamará igual que tu proyecto.

Azure Active Directory – Application – AADDemo

Como puedes ver en la imagen anterior, es posible crear aplicaciones directamente desde esta sección.
Si ejecutas tu sitio web desde Visual Studiopodrás comprobar que automáticamente se redirige a la página de login de Azure Active Directory para la aplicación AADDemo.

AADDemo – AAD login

Utiliza alguna de las credenciales que esté dada de alta dentro de ese directorio de Azure Active Directory. Una vez hecho el login satisfactoriamente, el usuario estará autenticado y podrá hacer uso de tu aplicación.

AAD – ASP.NET MVC – Logged

Lo mejor de todo esto es que ahora tienes la posibilidad de utilizar un directorio gestionado en la nube, que te ayudará a administrar los usuarios de tus aplicaciones de una manera sencilla. Además, serás capaz de obtener métricas, a las que podrás acceder desde el portal de Azure, para saber qué usuarios han estado accediendo a cada una de tus aplicaciones, entre otras muchas características.

Azure Active Directory – AADDemo – Total users and sign-ins

¡Saludos!