Muy buenas, en el presente Post voy a explicar qué es la seguridad Oauth 2 y cómo usarla en un servicio WebApi, haciendo uso de diferentes roles.

 

oauth2_image002

Logotipo de Oauth2

 

Oauth 2 es un protocolo abierto de seguridad (publicado en octubre de 2012 por el Internet Engineering Task Force (IETF)) que proporciona flujos de autorización específicos para aplicaciones Web, de escritorio, smartphones, etc. Empresas como Facebook, Google o Github, entre otras , utilizan este esquema de seguridad en sus API.  Oauth 2 describe como un usuario (consumidor del servicio) puede tener acceso la información ofrecida por un proveedor de servicio (APIs) mediante el uso de Tokens de acceso temporales. Estos dan acceso a la información del usuario de forma y tiempo limitado incluyendo código en la petición.

Hay que decir que este sistema tiene un punto débil, ya que si alguien captura el token de acceso podría usarlo para acceder a la información del usuario, aunque para evitar esto hay que tener en cuenta una serie de recomendaciones en el uso de esta tecnología:

  • Todo el intercambio de token con el servidor de autorización debe hacerse bajo el protocolo de comunicaciones TLS, el cual garantiza la integridad y confidencialidad de la comunicación. De esta forma evitamos que un atacante externo pueda capturar nuestros tokens de acceso, refresco o autorización, que podrían ser usados contra los servidores de autenticación o de recursos para obtener acceso a información reservada. El ámbito o acceso del token de acceso debe ser lo más limitado posible, limitando la información a la que se puede tener acceso.
  • El servidor de autorización es el encargado de autenticar al usuario de forma segura. El servidor debe garantizar que la contraseña (o el sistema de autenticación utilizado) sea lo suficientemente robusto para autenticar a los usuarios. En aquellos casos en los que no se pueda autenticar al cliente, el servidor debe utilizar otros métodos para la validación, como por ejemplo que sea necesario configurar la dirección URI de redireccionamiento que se utiliza.
  • La generación de los tokens por parte del servidor de autorización debe garantizar que no puedan ser generados, modificados o adivinados por terceras partes. La probabilidad de que un atacante genere un token debe ser inferior a 2-128 y recomendablemente inferior o igual a 2-160.
  • El tiempo de validez de los tokens o códigos de acceso debe ser de corto y de un solo uso. Además, si el servidor de autorización detecta múltiples intentos de obtención de un token de acceso con un mismo código de autorización, el servidor debe revocar el acceso de todos los códigos de acceso concedidos en base a este token de autorización ya que este token está comprometido.
  • Los clientes que se autentiquen con el servidor de autorización deben validar el certificado TLS del servidor, comprobando así la identidad del mismo y evitando posibles ataques man-in-the-middle que pueda sufrir el protocolo o posibles ataques de Phising que intenten suplantar la identidad del centro de autorización para obtener las credenciales del usuario.
  • Los clientes no deben almacenar los token en sitios vulnerables o accesibles, como por ejemplo serían las cookies.
  • El servidor de autorización debe comprobar que las URIs de redireccionamiento usadas tanto al conseguir el código de autorización como de acceso deben coincidir, evitando así que un atacante modifique la misma y obtenga acceso a la cuenta de un usuario.

oauth2_image003

                          Secuencia Oauth 2.0

 

 

Ahora vamos a ver como implementar este esquema de seguridad en un sencillo ejemplo, para ello usaremos Visual Studio de Microsoft. 

Lo primero que haremos será abrir un nuevo proyecto MVC empty y marcaremos las referencias para Web APi, para este proyecto necesitaremos agregar tres paquetes NuGet y actualizar el paquete de NewtonSoft.

nugets

 

Sobre nuestro proyecto usando el explorador de archivos buscaremos el Glogal.asax y lo eliminaremos, además añadiremos una nueva clase OWIN y la llamaremos Startup.cs. 

claseowin

Debemos editar el fichero AssemblyInfo.cs y añadir la siguiente linea :

aseembly

En el archivo Web.config incluiremos una clave de inicio indicando la clase OWIN:

webconfig

Ahora vamos a crear la capa MidleWare que se encargará de ver qué usuarios tienen acceso validando el usuario y Pw y en caso afirmativo les otorgará el Token de acceso. Para ello creamos una carpeta llamada Credentials y dentro de ella una clase a la que podemos llamar por ejemplo : AutorizacionCredencialesToken. en ella escribiremos las lineas siguientes:

11credentials

En este ejemplo hemos creado dos roles (Administrador y usuario), cuando solicitemos un Token el sistema sabrá con que perfil lo hemos hecho y nos permitirá acceder sólo a los datos del mismo.

En la clase Startup.cs, incluiremos las lineas siguientes:

startup

Esta clase utiliza a la capa MidleWare para saber si genera o no el token.

Ahora en la carpeta Models crearemos una clase para simular «zonas de usuarios» distintas donde tendremos acceso dependiendo del Role con el que solicitemos el Token.

11usuoadmin

En el Controlador debemos decorar nuestras funciones con los Roles a los que tienen acceso, si queremos que el Role Admin por ejemplo pueda acceder a varias funciones solo tenemos

que indicarles su Authorize correspondiente justo encima de las mismas.

1controllerdecoracion

 

Ya tenemos configurada la seguridad en nuestra Api. Ahora vamos a realizar las comprobaciones necesarias para saber que todo este funcionando correctamente. Para ello nos ayudaremos de la herramienta PostMan, este software nos permitirá realizar peticiones Post y Get usando usuario y contraseña.

Primero comprobamos que si hacemos una petición Post a nuestra Url «http://localhost:58186/recuperartoken» con unas credenciales no válidas el sistema nos devuelve un mensaje de error:

postmanerrorpw

Si introducimos el usuario y contraseña correctos el sistema nos devolverá el Token:

postmanclavecorrecta

El cual usaremos para realizar la petición Get a nuestra Zona:

postmanexitozona

 

y si intentamos acceder con este Token a una zona que no nos corresponde el sistema nos deniega el acceso:

postmanzonasinpermiso

Así quedaría comprobado que  la seguridad Oauth 2.0 está funcionando correctamente.

Hasta aquí este post de cómo implantar seguridad Oauth 2.0  espero que os sirva y os incluyo un enlace Github donde podéis descargar todo el código.

 

 

Enlace GitHub:

https://github.com/jgiganto/PostJesusSeguridadWebApi.git

Referencias:

www.certsi.es, Wikipedia, http://www.ietf.org.

 

Autor: Jesús Giganto Diez

Curso: Microsoft MCSA Web Applications + Microsoft MCSD App Builder + Xamarin

Colegio Tajamar, curso 2017-2018.

https://www.linkedin.com/in/JesusGiganto/

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.