Validar token OAuth v2 entre .Net framework y .Net core

Con la llegada de .Net core y el uso de microservicios, es posible que te enfrentes a la necesidad de que un nuevo microservicio que utiliza tecnología .Net core sea capaz de validar un token generado por un viejo microservicio (por ejemplo .Net 4.5 o .Net 4.6) que se encarga de la autenticación del usuario y la generación del mencionado token. Debido al cambio de algunas de las librerías de seguridad en .Net core, y según como tengas construido tu provider de OAuth v2 para generar el token, lograr esta validación puede no ser una tarea inmediata.

En esta entrada te muestro una de las posibles soluciones para lograrlo. 

Alguna de las implementaciones más comunes que se pueden encontrar en la red para llevar a cabo la generación de un token de OAuth de tipo jwt, con .Net es la siguiente.

En esta implementación puedes ver como en la línea 22 se está generando un firmado del token usando una firma Hmac que usa un byte[] leído desde el webconfig.

La generación del token usará esta clase anterior (CustomJwtFormat) desde tu clase Startup de la siguiente manera.

La implementación que normalmente se indica para validar este token es la que muestro a continuación, no es la única desde luego.

Si ahora implementas un microservicio con .Net core y persigues que un token generado de esta forma sea validado, no va a ser posible lograrlo, debido a un error al reconocer el firmado de dicho token dado que en core no tendrás disponible la librería Microsoft.Owin.Security para generar la firma con HmacSigningCredentials, y por tanto la comparación de ambas firmas fallará.

En lugar de esta librería tendrás disponible la siguiente: Microsoft.IdentityModel.Tokens.

Una posible implementación con .Net core para validar un token jwt de OAuth v2 es la siguiente.

El secret, issuer y audience que se están especificando en esta implementación, deben estar comprendidos entre aquellos que han sido utilizados para la generación del token, de forma que el token se pueda validar.

No obstante, el algoritmo que se está usando para firmar el token, y comparar las firmas, declarando si el token es válido, no se corresponde con el que se muestra en la generación del token, de forma que el token dará un error por validación de la firma.

En este caso se está usando el método SymmetricSecurityKey.

Una posible solución para que tu microservicio con .Net core pueda validar el token generado desde tu anterior implementación en un servicio con .Net Framework es modificar como se firma el token a un mecanismo que puedas validar a través de esta librería de core.

El cambio que sugiero el siguiente.

En este caso, se trata de sustituir la línea 22 de la primera implementación que he incluido, modificando así la valirable signingKey, añadiendo la linea que genera el securitykey a partir del “SECRET”, que puedes continuar leyendo desde el webconfig. Para ello usa el método SigningCredentials, que si es compatible con el uso de SymmetricSecurityKey, de hecho se ha añadido una línea nueva para generar el securityKey como he mencionado. En esta línea se usa InMemorySymmetricSecurityKey de Microsoft.Owin.Security.

Con esta modificación, tu servicio .Net core será capaz de validar tu token en cada controlador con el uso de [Authorize] y la implimentación que te he indicado.

Pues está listo, a lanzarse a crear microservicio con .Net core y Visual Studio 2017 a pesar de que tu sistema de autenticación y generación de token para uso de OAuth esté usando implementaciones más antiguas.

Un saludo.

Deja un comentario