ASP.NET 5 (vNext) | Conectando nuestro sitio ASP.NET 5 beta5+ con Azure Active Directory

Con las últimas actualizaciones Visual Studio y ASP.NET 5, ya es posible crear un sitio conectado a un directorio activo desde la creación de la plantilla del proyecto, cosa que veníamos echando de menos los que ya estábamos haciendo algunas cosas con esta nueva versión de ASP.NET aunque, como podremos observar, es una tarea bastante sencilla una vez la hayamos visto.

Para ilustrarlo, en este artículo haré una introducción sobre cómo crear nuestra aplicación conectada con Azure Active Directory y el código que pone nuestra plantilla para conectarse, hacer login y logout y ver que funciona correctamente publicada como Azure Web App. Podéis descargaros el ejemplo de GitHub.

Creando el proyecto

Lo primero es crear un proyecto ASP.NET 5 usando la plantilla de Visual Studio como se ve en la imagen y para ir ahorrando tiempo, marcamos la casilla de «Alojar en Azure» en una Web App con lo que directamente podremos publicar nuestro sitio web y hacer pruebas online.

Para conectar con el directorio activo, seleccionamos la opción «Cambiar autenticación» y realizamos los siguientes pasos:

  1. Marcar la opción «Cuentas de trabajo o estudiante»
  2. Seleccionar el tipo de Directorio Activo con el que vamos a conectar, que en nuestro ejemplo será «Cloud – Single Organization»
  3. Indicar el dominio de nuestro directorio activo, en este caso XXXXX.onmicrosoft.com
  4. Si queremos hacer operaciones de lectura de datos del directorio activo, debemos marcar la opción «Leer datos del directorio»
  5. Aceptar

Desgranando el código

Al crear el proyecto directamente conectado con Azure Active Directory, automáticamente se ha generado código que hace que todo funcione pero debemos saber qué es y cómo funciona, así que vamos a ver qué se ha hecho.

Startup.cs

Abrimos el fichero Startup.cs que se encuentra en la raíz del proyecto y vemos código generado automáticamente en dos de los métodos de este fichero.

ConfigureServices(…)

Aquí podemos apreciar que se ha añadido código que nos permite la autenticación usando las cookies y después se configurar el acceso al directorio activo leyendo parámetros de configuración que en la creación del proyecto se generaron automáticamente en la Web App. Si no quisiéramos estos parámetros, tendríamos que configurarlos en el fichero config.json que se encuentra también en la raíz del proyecto.

  1. services.Configure < CookieAuthenticationOptions > (options => {  
  2.     options.AutomaticAuthentication = true;  
  3. });  
  4. services.Configure < OpenIdConnectAuthenticationOptions > (options => {  
  5.     options.AutomaticAuthentication = true;  
  6.     options.ClientId = Configuration[«Authentication:AzureAd:ClientId»];  
  7.     options.Authority = Configuration[«Authentication:AzureAd:AADInstance»] + Configuration[«Authentication:AzureAd:TenantId»];  
  8.     options.PostLogoutRedirectUri = Configuration[«Authentication:AzureAd:PostLogoutRedirectUri»];  
  9.     options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;  
  10. });  

 

Configure

Vemos que en este método se ha añadido la inicialización de OpenId con la siguiente instrucción que establece el middleware de OpenId como el sistema encargado de la autenticación contra Azure Active Directory.

  1. // Add OpenIdConnect middleware so you can login using Azure AD.  
  2. app.UseOpenIdConnectAuthentication();  

 Como se puede observar, es todo muy sencillo ya que sólo hay que establecer los parámetros de conexión con nuestro Azure Active Directory e inicializar el middleware.  

AccountController.cs

Dentro de este controlador debe ir el código que interactúe con el usuario para realizar las tareas de autenticación que, en este caso, dado que se trata de un directorio activo, sólo incluirán el Login y el Logout. Por ello, de una forma muy sencilla, se establece que el login se realiza mediante el middleware de OpenId con una simple instrucción donde además se le puede especificar la Url de retorno que aconsejo modificar para que vuelva siempre a la página desde la que el usuario solicita la autenticación.

public IActionResult SignIn() {  
    return new ChallengeResult(OpenIdConnectAuthenticationDefaults.AuthenticationScheme, new AuthenticationProperties {  
        RedirectUri = «/»  
    });  
}  
public IActionResult SignOut() {  
    var callbackUrl = Url.Action(«SignOutCallback»«Account», values: null, protocol: Request.Scheme);  
    Context.Authentication.SignOut(CookieAuthenticationDefaults.AuthenticationScheme);  
    Context.Authentication.SignOut(OpenIdConnectAuthenticationDefaults.AuthenticationScheme, new AuthenticationProperties {  
        RedirectUri = callbackUrl  
    });  
    return new EmptyResult();  
}  
public IActionResult SignOutCallback() {  
    if (Context.User.Identity.IsAuthenticated) { // Redirect to home page if the user is authenticated.  
        return RedirectToAction(nameof(HomeController.Index), «Home»);  
    }  
    return View();  
}  

Como se puede observar, no hay nada muy complejo dado que de todo ello se encarga el middleware y sólo tenemos que indicar los parámetros y el comportamiento que deseamos.

Publicando en Azure

Cuando se haya creado el proyecto, ya estará preparado para publicar en Azure ya que, durante el proceso se ha creado la correspondiente Web App, con lo que sólo tendremos que hacer click con el botón derecho sobre el nombre del proyecto, y seleccionar «Publicar».

Habrá que configurar correctamente los parámetros de la publicación, seleccionando la Web App correspondiente y, finalmente estableciendo las propiedades adecuadas para el directorio activo tal y como muestro en la imagen a continuación. Notad que aquí ya no es necesario establecer el directorio activo porque se ha generado de forma automática ese parámetro en la Web App.

 

Probando la aplicación

Finalmente, podemos probar la aplicación y comprobar cómo se nos solicita aprobar el acceso a nuestra cuenta de la aplicación asociada al directorio activo.

 

Resumen

Hemos visto lo sencillo que es conectarse a Azure Active Directory con la plantilla del proyecto de ASP.NET 5 beta5 pero, además, viendo el código también resultará muy sencillo lograrlo aunque no hayamos partido de esa plantilla ya que sólo tenemos que establecer los parámetros y determinar el comportamiento del middleware de OpenId.

Espero que os haya sido de utilidad y que aprovechéis al máximo las capacidades de ASP.NET 5 que será el nuevo estándar propuesto por Microsoft cuando vea la luz definitiva dentro de muy poco.

Enjoy coding!!