por example autenticacion asp.net-mvc asp.net-web-api owin bearer-token

asp.net mvc - example - MVC.NET cookie autentica el sistema accediendo a una Web Api con autenticación de token



web api authentication token example c# (3)

Tengo un cliente Mvc 5 que tiene una autenticación de cookie Ownin. También tengo una Web Api que está protegida con el token de Owin Bearer (utilicé la plantilla de Web Api VS2013, que crea el punto final del token)

Ok, ahora mi cliente Mvc 5 necesita usar mi WebApi. He creado un método para obtener el token de portador:

internal async Task<string> GetBearerToken(string siteUrl, string Username, string Password) { HttpClient client = new HttpClient(); client.BaseAddress = new Uri(siteUrl); client.DefaultRequestHeaders.Accept.Clear(); HttpContent requestContent = new StringContent("grant_type=password&username=" + Username + "&password=" + Password, Encoding.UTF8, "application/x-www-form-urlencoded"); HttpResponseMessage responseMessage = await client.PostAsync("Token", requestContent); if (responseMessage.IsSuccessStatusCode) { TokenResponseModel response = await responseMessage.Content.ReadAsAsync<TokenResponseModel>(); return response.AccessToken; } return ""; }

Y en mi acción Mvc lo llamé:

public async Task<ActionResult> Index() { var token = await GetBearerToken("http://localhost:6144/", "teste", "123456"); using (var client = new HttpClient()) { client.DefaultRequestHeaders.Add("Authorization", "Bearer "+ token); var response = await client.GetAsync("http://localhost:6144/api/values"); if (response.IsSuccessStatusCode) { var data = response.Content.ReadAsAsync<IEnumerable<string>>(); return Json(data.Result, JsonRequestBehavior.AllowGet); } } }

Todo funciona bien ... Pero necesito usar la Web Api en todas mis acciones ... Entonces, ¿cómo puedo mantener ese token (a pesar de recibir un nuevo token por cada solicitud) y cómo verificar si expiró ... es posible para mantener eso junto con la cookie de autenticación de alguna manera? ¿Alguna de las mejores prácticas para lidiar con ese escenario?

Gracias


El token de portador no es una buena forma de autorizar su aplicación web. Si almacena el token de servicios en la cookie, estará disponible para los clientes de la aplicación, por lo que la capa de servicio será vulnerable a los clientes de la aplicación. La única solución parece ser mantener el token en una sesión, pero perderá la naturaleza sin estado de su aplicación.

Aquí se describe qué / cómo se debe usar el token de portador: "Un token de portador es solo una cadena aleatoria grande que un cliente debe presentar en cada llamada a la API. Los tokens de portador son simples porque no hay un código especial de validación o firma en ninguno de los extremos. El cliente es responsable de almacenar el token en un lugar seguro y de enviarlo con cada solicitud. El servidor es responsable de buscar el token en una base de datos y asegurarse de que sea válido, eso es todo ".

Este es un buen ejemplo del uso del token de portador en una aplicación de página única donde el cliente habla directamente con el servicio.

De todos modos, le sugiero que utilice la autenticación HMAC , BCrypt o ClientCertificates. Incluso amazon usa para autenticar solicitudes REST.


Si desea administrar los tokens en todas sus acciones, debe cambiar el código para usar un filtro de autorización personalizado. Ese filtro se puede agregar a todas las solicitudes de la API web, todas las acciones para un controlador o una acción individual. Para hacer eso, derive del AuthorizeAttribute y emita la llamada GetBearerToken desde el filtro. Pegue el token en el contexto HTTP para su uso durante el procesamiento de la solicitud. En lugar de llamar directamente a la creación de instancias HttpClient, puede usar una fábrica para generarlas y agregar los tokens apropiados para la autenticación.

En cuanto a determinar si los tokens han caducado, puede agregar un filtro adicional que verifique la aparición de errores específicos o, alternativamente, emitir una verificación en el filtro de autorización. No conozco todos sus requisitos, por lo que es difícil determinar la solución adecuada allí.


Si lo hago bien, su aplicación de cliente MVC 5 está accediendo a una WebAPI de una aplicación diferente. El Cliente MVC 5 usa una cookie para autenticar al usuario. Para acceder a la WebAPI, obtiene un token de portador desde el punto final / Token y lo envía en el encabezado de Autorización.

No llama a la WebAPI desde el código Javascript del lado del cliente, simplemente la llama desde MVC Actions que se ejecutan en el servidor de la aplicación MVC5.

Obtener un token nuevo antes de cada llamada de servicio suena mal Esto significaría 2 viajes de ida y vuelta cada vez. Esto no puede ser performante.

Si lo hice bien, podrías:

  1. Almacena el token en el objeto Session. Mientras su usuario de la aplicación MVC esté autenticado y su sesión esté activa, siempre tendrá el mismo token. Si está vencido, obtendría un 401 acceso no autorizado desde la WebAPI. Para mantener su unidad de acción MVC verificable, podría incluir el acceso de sesión en un servicio que inyecte en la acción (inyección de dependencia).

  2. puede almacenar el token en una cookie similar a la cookie de autenticación ya existente. De esta manera no necesitarías una sesión en el lado del servidor. Una vez más, envolvería el acceso para obtener el token de la cookie en un servicio que utilizan todas sus acciones.

Yo usaría el almacenamiento de sesión. Sencillo. Hacia adelante Pero tal vez me esté perdiendo algo

Espero que esto te ayude. Comentarios apreciados :-)