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.
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:
- Visual Studio 2013.
- Owin, lo descargamos del nugget.
- Postman, para realizar pruebas al servicio rest, lo puedes descargar desde aqui https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop.
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:
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:
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í:
- 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.
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.
Gracias por el aporte, soy nuevo en .net y me fue de gran ayuda para genera mi primer api en esta tecnología.
ResponderEliminarMe alegra mucho que te sea de ayuda :) Saludos.
EliminarEste comentario ha sido eliminado por el autor.
ResponderEliminardisculpa existe algun medio para eliminar o cerrar la sesion del token?
ResponderEliminarHola, 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
EliminarConsulta!, 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.
ResponderEliminarHola,
EliminarTe 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.
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.
EliminarPor 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.
Hola,
EliminarPuedes darle una mirada a este link https://www.codeproject.com/Articles/1084143/Authentication-Token-Service-for-WCF-Services-Part
Espero te ayude.
Saludos
Este comentario ha sido eliminado por el autor.
ResponderEliminarEste comentario ha sido eliminado por el autor.
Eliminaresto me sirve para consumir mi webapi con credenciales ?
ResponderEliminar