Identidad como Servicio (IDaaS) — ASP Net Core API & Okta

Este es el tercer artículo de una serie sobre Identidad como Servicio — Identity-As-A-Service. Es este artículo vamos a ver cómo configurar una API ASP Net Core para validar las identidades de los usuarios usando Okta.

Para este ejemplo necesitamos el app que desarrollamos en el articulo anterior — Identidad como servicio (IDaaS) — Okta & ASP Net Core. Además vamos a seguir utilizando Visual Studio 2017 Community Edition.

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

Protegiendo el acceso a API

El objetivo de estos ejemplos es agregar la validaciones necesarias en la API desarrollada en ASP Net Core para permitir solamente invocaciones desde apps que tengan un usuario valido conectado.

Este ejemplo usa Web Apps pero es muy simple hacer lo mismo para Single Page App usando JavaScript o desde una app Mobile. Lo importante es la propagación del token desde el cliente a la API, que va a validarlo antes de devolver el resultado de la invocación.

Este es un de los mejores aspectos del modelo de OAuth2.0 y OIDC. Cada capa de nuestras apps no tienen que confiar en quien las contacta, solamente existe una relación de confianza con el proveedor de identidades. El elemento clave del modelo son los JWT — JSON Web Token

Esta relación de confianza se logra mediante la publicación de los parámetros de configuración que son públicos para todo servicio que quiera utilizarlos. Se pueden agregar nuevos servicios y capas a nuestro ecosistema sin necesidad de tocar a los servicio existentes.

Algo para tener en cuenta cuando creamos o modificamos un API Controller en ASP Net Core es que el atributo [Authorize] lo podemos aplicar a un método en particular o a toda la clase. Cuando se lo aplica a toda la clase, entonces todos los métodos va a requerir de cumplir los criterios de acceso antes de responder.

Web API utilizando Okta

Comencemos creando y configurando una ASP Net Core API para utilizar Okta como proveedor de identidades. Nuevamente la mayoría de los cambios los tenemos que hacer en startup.cs aunque en este ejemplo también vamos a crear un nuevo controller para retornar uno de los valores del JWT token.

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 la validación del JWT en el código, usamos el appsettings.json para mayor flexibilidad.

Luego hay que usarAddAuthentication para indicar los esquemas de Authentication y AddJwtBearer para indicar los parámetros de validacion del JWT, por lejos la sección más importante del código. El valor Authority depende de nuestra cuenta de Okta, el mismo valor que usamos en nuestra Web App.

Es obligatorio que nuestra Web App y API usen la misma Authority para poder propagar las identidades. El valor Authority es el mismo sin importar la Web App registrada en Okta

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

Nuevo API Controller

Cada nuevo proyecto API en VS 2017 crea un API controller por defecto ValuesController. En vez de modificarlo, vamos a crear un controller nuevo. Esto nos va a permitir ver que las invocaciones ValuesController no van a requerir el JWT pero si va a ser necesario para el nuevo controller .

Al nuevo API Controller lo vamos a llamar TokenController y vamos implementar solamente el action Get que simplemente retorna la fecha cuando expira el token. El atributo [Authorize] indica que para invocar a cualquier método de esta clase se necesita un usuario valido.

Invocación desde la Web App

Con el API completa, vamos a modificar la Web App para invocar al nuevo API Controller. Vamos a modificar la pagina About — About.cshtml.cs — que trae por defecto el proyecto de una Web App en Visual Studio 2017.

Usando HttpClient invocamos la API. Lo importante es incluir el access token que Okta provee a la Web App para que el API nos de la respuesta correcta y no un error.

Una configuración critica para este ejemplo es la propiedad SaveTokens en las configuración de OIDC en la web app

Luego de realizar la invocación, podemos tomar la respuesta y mostrarla en la pantalla.

Gracias Totales por Leer!!!

Links


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