Ir al contenido principal

Inicio de sesión basado en tokens con Web Api

Hola a todos, el objetivo de este post será realizar el mecanismo de inicio de sesión basado en tokens para un servicio Rest Full con Web Api y Owin.

Antes de empezar veamos un poco de teoría:
Web Api:  
Es un marco que facilita la creación de servicios HTTP disponibles para una amplia variedad de clientes, entre los que se incluyen exploradores y dispositivos móviles. ASP.NET Web API es la plataforma perfecta para crear aplicaciones RESTful en .NET Framework.

Autenticación basada en Token:
La forma preferida hoy en día para autenticarse desde el front-end ya sea web o mobile es la de tokens por las siguientes razones:
Escalabilidad de servidores: El token que se envía al servidor es independiente, contiene toda la información necesaria para la autenticación del usuario, por lo que añadir más servidores a la granja es una tarea fácil ya que no depende de una sesión compartida.
Bajo acoplamiento: Su aplicación front-end no se acopla con el mecanismo de autenticación específico, el token se genera desde el servidor y su API se construye de una manera que se pueda entender y hacer la autenticación.
Móvil amigable: Al tener una forma estándar para autenticar a los usuarios va a simplificar nuestra vida si decidimos consumir la API de servicios de fondo desde aplicaciones nativas como IOS, Android y Windows Phone.

OWIN (Open Web Interface For .NET)
El proyecto de OWIN lo empezó la comunidad .NET creando una abstracción entre los servidores web y los componentes del Framework. El diseño de esta abstracción ha tenido dos objetivos fundamentales, crear una abstracción lo más simple posible y que utilice las mínimas dependencias posibles. Todo esto nos ayuda a la hora de crear nuevos componentes, ya que nos permite desarrollarlos más fácilmente y son más fáciles de utilizar e integrar en el resto de proyectos.

OWIN define tres tipos de componentes básicos:
Host: Es quien "hospeda" toda la infrastructura. Quien configura e inicializa el resto de componentes.
Servidor: Es quien recibe las peticiones y genera las respuestas

Middleware: Es el resto de componentes OWIN. Son componentes modulares que se "encadenan" uno tras otro. La petición pasa de uno a otro y cada uno genera una parte de la respuesta final (o hace lo que sea). Podemos tener un componente OWIN para seguridad, otro para hacer Log, y otro para generar APIs REST. 
WebApi es un componente OWIN. SignalR es otro componente OWIN.

Proyecto Katana:
El proyecto Katana son los componentes OWIN creados por microsoft. Tambien pueden ser software libre y como mencionamos anteriomente un ejemplo son SignalR y Web API.
Los objetivos de Katana son:
-Componentes portables: Facilemnte sustituibles y actualizables sin alterar los demas componente. Tambien implica que puedan correr tanto en IIS como en servidores de terceros.
-Modular y flexible: Tiene como objetivo pequeños componentes centrados en tareas concretas por lo que permite elegir cual de ellos utilizar.
-Eficiente y escalable: Al tener el framework en pequeñas parte nos da la posibilidad de utilizar solo los componentes que necesitamos por lo tanto incrementa el rendimiento de nuestras aplicaciones.

Nota: Utilizaremos el componente Microsoft.Owin para el manejo de Tokens.

Ahora si manos a la obra. Las herramientas a usar son las siguientes:

1. Creando el proyecto Web Api





Verificamos que el proyecto se creó con el framework 4.5, si esta con otro framework por favor cambiarlo.
Podemos ver que se creó nuestro proyecto con algunos controladores y vistas por defecto que para esta ocasión no los tomaremos en cuenta.

Por defecto en el proyecto debe estar ya referenciado las librerías de Microsoft.Owin:
Como pueden ver también están las librerías para interactuar con facebook, google, twiter, etc. Si no los van a necesitar entonces se elimina.

1.      Si no tienen referenciado Owin pueden descargarlo desde el nugget:
  •      Owin
  •      Microsft.Owin

s   Ahora nos dirigimos al archivo Startup.Auth.cs que se encuentra en la carpeta App_Start, borramos lo que no necesitamos para nuestro caso y lo dejamos así:




      Podemos ver que se crea un objeto de tipo OAuthAuthorizationServerOptions con ciertos parámetros que es necesario que se explique:
      TokenEndpointPath = new PathString("/Token")  Como se puede deducir sirve para acceder a la generación del token ejemplo: localshot:80/api/token 
      Provider = new ApplicationOAuthProvider(PublicClientId) Proveedor encargado de manejar los tokens.
      AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin") Si se necesita redirigir a un componente externo para la generación del token.
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(14) Tiempo de expiración del token.


Nos dirigimos a la clase 
ApplicationOAuthProvider que es el proveedor encargado de manejar los tokens. En el método GrantResourceOwnerCredentials es donde vamos a agregar la lógica del login, para este ejemplo lo haremos de manera simple y en el mismo método, pero si se va a utilizar en una aplicación real se debe crear una capa lógica. El método debería quedar así:
     
     Como podemos ver creamos validamos las credenciales, si son correctas creamos nuestro identity claim y lo autenticamos.

    Ahora ya estamos listos para generar el token, para probarlo utilizaré una aplicación llamada Postman que permite probar servicios rest full.

    Levantamos el servicio con F5, luego abrimos Postman y creamos una nueva pestaña.
    Seleccionamos el verbo POST e ingresamos la url para obtener el token, en mi caso es la siguiente http://localhost:3586/token.
    En la opción body seleccionamos el tipo que en este caso sería raw y en el textarea mas abajo ingresamos lo siguiente UserName=luis&Password=rojas&grant_type=password que básicamente es el usuario y password.
    Si las credenciales son correctas el servicio genera el token de autenticación y nos lo devuelve como se puede observar en la siguiente imagen:

     Podemos ver que nos devuelve un objeto json con el token, el tipo de token, y datos de la expiración del token.
     Probemos ahora con credenciales incorrectas:

    Como podemos ver el servicio valida las credenciales enviadas y nos devuelve un mensaje.

    Por ahora eso es todo, mas adelante estaré publicando mas cosas sobre Web Api.
    Les comparte el proyecto en Github https://github.com/lrojasv/EjemploWebApiToken.git

    Que tengan un buen día.







Comentarios

  1. Gracias por el aporte, soy nuevo en .net y me fue de gran ayuda para genera mi primer api en esta tecnología.

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. disculpa existe algun medio para eliminar o cerrar la sesion del token?

    ResponderEliminar
    Respuestas
    1. Hola, los token generados por OWIN no se pueden eliminar simplemente se tiene que esperar a que expiren, en el caso que sea necesario puedes guardar los token de una base de datos y ahí manejar la lógica de tus sesiones. Saludos

      Eliminar
  4. Consulta!, qué diferencias existen entre crear una API Rest con Web API o crearla con WCF, y principalmente a la hora de implementar este tipo de autenticación en la API.

    ResponderEliminar
    Respuestas
    1. Hola,
      Te menciono las diferencias de crear rest full con web api y wcf:
      1. WCF Rest:
      • Se necesita realizar una serie de configuraciones para volverlo rest full, como tener habilitado webHttpBindings, WebGet y UriTemplate
      • Se necesita configurar el IIS para que pueda aceptar todos los verbos sobre archivos .svc
      • Soporta XML, JSON y ATOM Data format.
      2. Web API:
      • Creado para la creación de servicios HTTP (rest Full)
      • Usa todas las características de HTTP como URIs, request/response headers, caching, versioning, various content formats
      • Soporta características MVC como routing, controllers, action results, filter, model binders, IOC container or dependency injection, unit testing
      • Los response son formateados por Web API’s MediaTypeFormatter (JSON, XML o cualquier formato que quieras agregar a MediaTypeFormatter)

      Por lo tanto si necesitas crear un servicio que sea rest full optaría por web api por lo antes mencionado.
      Te dejo unos links para tener más detalle:
      https://msdn.microsoft.com/es-es/library/jj823172(v=vs.110).aspx
      http://www.dotnettricks.com/learn/webapi/difference-between-wcf-and-web-api-and-wcf-rest-and-web-service

      Gracias.

      Eliminar
    2. Buenas tardes, gracias por tu explicación me pareció suficiente. Y si para volver un servicio RESTfull tuve que hacer algunos ajustes en el archivo de configuración para aceptar todos los verbos http; incluso para validar o permitir algo de la autorización CORS. Llamadas hacia otro dominio, o algo de eso. Revisaré tus links.

      Por otra parte algo que tengas (Ejemplos, links) para llevar este tipo de autenticación a WCF; autenticación por JWT. He buscado mucha info, pero no veo muchos ejemplos claros para usarlos con C#. Tengo una idea somera de lo que es JWT, pero no se como llevarlo a la práctica. Aunque en última instancia quizá empiece a ver eso del Web API.

      Reitero mis agradecimientos. Buena tarde.

      Eliminar
    3. Hola,
      Puedes darle una mirada a este link https://www.codeproject.com/Articles/1084143/Authentication-Token-Service-for-WCF-Services-Part

      Espero te ayude.
      Saludos

      Eliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  6. esto me sirve para consumir mi webapi con credenciales ?

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Configuración de Modo de estado de Sesión StateServer para aplicaciones ASP NET de alta disponibilidad

Hola a todos, el objetivo de este post es mostrar cómo se configura una aplicación para que soporte balanceo de carga y este alojado en una granja de servidores.  Con esto se quiere lograr que la aplicación sea de alta disponibilidad. Se necesita que la sesión persista a pesar de que se redireccione al usuario hacia otro servidor (recordar que estamos con un balanceador en una granja de servidores) o se reinicie la aplicación. Para esto en ASP .NET, ya sea web form o mvc la forma de poder manejar este caso es configurando el modo de estado de sesión fuera del proceso. ASP .NET tiene los siguientes modos de estado de sesión: ·          Modo InProc , que almacena el estado de sesión en memoria en el servidor Web. Éste es el valor predeterminado. ·          Modo StateServer , que almacena el estado de sesión en un proceso distinto denominado "servicio de estado de ASP.NET". Este modo garantiza que el estado de sesión se mantiene si se reinicia la aplicación Web y qu

Manejo de Caché en ASP NET MVC

Hola a todos, el objetivo de este post es aclarar ciertos puntos sobre el manejo de caché en ASP NET MVC. El manejo de la caché correctamente nos permite mejorar el rendimiento de nuestras aplicaciones, permitiéndonos almacenar información de uso frecuente y dentro de la memoria de alta velocidad. El manejo de la caché se puede dar tanto en el servidor como en el cliente. Este es un resumen de manejo de caché en ASP NET MVC: Page Output Caching: Es el manejo de caché a nivel de página o de acción en MVC. El navegador web puede almacenar en caché cualquier solicitud HTTP GET durante un periodo predefinido por lo que si el usuario solicita la misma URL, el navegador no llama al servidor, si no que carga la página desde la caché del navegador local. Te da la opción de decidir donde se va almacenar la página ya sea en el cliente o en el servidor. Solo se necesita decorar la acción con el atributo "OutputCache" e indicarle como se va a manejar: Duration (tiempo de durac