Identidad como servicio (IDaaS) — AWS Cognito & ASP Net Core

Lucas Lopez
6 min readMay 29, 2018

--

Este es el cuarto artículo de una serie sobre Identidad como Servicio — Identity-As-A-Service. Es este artículo vamos a ver cómo configurar ASP Net Core para usar AWS Cognito como proveedor de identidades. Los conceptos son similares a usar otro proveedor, como ser Okta, aunque siempre hay algunas sutilezas en la configuración.

Para este ejemplo necesitamos dos cuentas de email, una para el administrador de AWS y otra para ver cómo es el registro de un usuario. Además vamos a usar Visual Studio 2017 Community Edition.

Todo el código de este ejemplo está disponible en GitHub.

Web App

Primero creamos una Web Application en ASP Net Core desde Visual Studio 2017. Para este caso, la app que crea por defecto es suficiente. Configurar Authentication en ASP Net Core 2.0 es muy simple, la mayor parte de los cambios en startup.cs. Pero antes de empezar a configurar la app, tenemos que tener nuestro servicio de Identidad como Servicio. Comencemos con la configuración en AWS Cognito.

Amazon Web Services — Nueva Cuenta

Para poder utilizar AWS Cognito es necesario tener una cuenta de Amazon Web Services. El servicio de AWS Cognito está incluido en el Free Tier y nunca expira. Podemos manejar hasta 50000 usuarios activos mensuales. Y nos da lo básico para poder gestionar los usuarios de nuestras apps.

Para crear la cuenta tenemos que ir al registro de AWS. Luego de completar los detalles iniciales, tenemos que completar más datos, lamentablemente incluye completar los datos de una tarjeta de crédito y la verificación automática con una llamada por teléfono. Luego de crear la cuenta hay que seguir unas indicaciones de Amazon para no utilizar el usuario Root para las configuraciones pero en este ejemplo lo vamos a obviar e ir directamente a AWS Cognito a crear el User Pool.

AWS Cognito User Pool

Para acceder a AWS Cognito podemos buscar la opción en el menú All Services en la sección Security, Identity & Compliance o simplemente buscarlo.

La documentación está disponible en inglés y español. Explica muchos más detalles de los que vamos a ver es este ejemplo y es muy recomendable para quienes quiera usar el servicio seriamente.

La creación empieza desde la página principal de AWS Cognito, eligiendo la opción Manage your User Pools

Como no tenemos creado ningún User Pool todavía, la única opción disponible es Create a user pool. Lo primero que tenemos que indicar es el nombre — Pool Name — . Como la configuración por defecto nos sirve, podemos seleccionar la opción Review Defaults y crear el Pool.

Ahora tenemos que configurar nuestra app para que pueda acceder. Esto lo hacemos desde la opción General settings > App clients, eligiendo Add an app client. Indicamos el nombre de la app — App client name — y listo.

Luego tenemos que configurar como nuestra app va a negociar las identidades con AWS Cognito. Esto lo configuramos desde App integration > App client settings.

Primero que nada tenemos que seleccionar el proveedor de identidades — Enabled Identity Providers — en nuestro caso solo tenemos la opción Cognito User Pool. Luego tenemos que indicar la URL donde AWS Cognito va a contactar a nuestra app después de que el usuario complete en sign-in — Callback URL(s)-. Es nuestro caso es la URL localhost donde va a correr nuestra app, más el path signin-oidc. El último paso es configurar OAuth 2.0. En nuestro caso vamos a elegir los valores Authorization code grant y email, openid & profile.

Datos para la configuración

En la opción General settings > App clients, podemos ver los detalles la configuración, principalmente el App client id y App client secret que necesitamos para configurar el acceso de nuestra app.

El último valor que necesitamos es el PoolId que está en General setting para poder configurar la dirección de donde la ASP Net Web App obtiene los valores de configuración. La URL depende de dos variables realmente, el PoolID y la región donde está configurado nuestra instancia de AWS Cognito. Es este caso US East (Ohio)

https://cognito-idp.us-east-2.amazonaws.com/us-east-2_54E8jWmWw/.well-known/openid-configuration

Otra configuración que puede ser importante es App integration > Domain name. Nos permite configurar cual va a ser el dominio de las páginas de sign-in y sign-up.

Terminada la creación de la app en AWS Cognito, podemos volver a Visual Studio.

Cambios en Startup.cs

Los primeros cambios necesarios son los using

La mayoría de los cambios son en el método ConfigureServices. Algunos comentarios antes de ver el código.

Primero, en vez de harcodear las propiedades de la conexión OIDC en el código, usamos el appsettings.jsonpara mayor flexibilidad.

Luego, al estar usando Razon Pages, la forma de indicar cuales son los recursos a proteger es distinta, usando el método AuthorizePage, en este caso solo la página Index.

La tercera sección tiene dos partes, AddAuthentication para indicar los esquemas de Authentication y AddOpenIdConnect para indicar los parámetros de la conexión OIDC, por lejos la sección más importante del código.

Si leyeron el ejemplo usando Okta, verán que AWS Cognito usa distintos valores de las opciones de OIDC, por ejemplo MetadataAddress en vez de Authority . El resto del código es casi igual.

Y finalmente, modificar el método Configure para usar el modelo de Authentication que configuramos en el paso anterior.

Al ejecutar la app nos lleva automáticamente al Sign In de AWS Cognito ya que para acceder a Index necesita que el usuario este autenticado. A diferencia de Okta, AWS Cognito nos permite crear un nuevo usuario desde esta página.

Los datos que nos va a pedir el formulario de Sign-up dependen de los valores del perfil que configuramos como obligatorios. En nuestro caso, solamente una dirección de correo.

Al completar el registro, AWS nos enviara un email con el verification code. Luego de copiarlo y confirma la cuenta, AWS Cognito nos devuelve a nuestra app, ya identificados.

Algunos comentarios finales

La configuración del servicio en ASP Net Core 2.0 es muy simple y en poco tiempo podemos estar desarrollando nuestra app sin preocuparnos de la seguridad o gestionar los usuarios nosotros mismos. Este caso muestra la configuración básica para AWS Cognito pero la verdad es que cualquier otro servicio OIDC requiere un esfuerzo similar.

Es recomendable usar ASP Net Core Secrets para guardar los valores ClientId y ClientSecret en vez de usar appsettings.json.

Gracias Totales por leer!!!

Todas las opiniones expresadas son mías y no representan opiniones de ninguna entidad con la que he estado, estoy o estaré afiliado.

All views expressed are my own and do not represent opinions of any entity whatsoever with which I have been, am now, or will be affiliated

--

--

Lucas Lopez

Avid Technologist at heart, a lifetime of projects, experience in software development and project management areas.