net individual example bearer asp c# asp.net-web-api authorization

c# - individual - Autentificando la API web de ASP.NET



web api individual user accounts (2)

He creado una nueva API web de ASP.NET y las cosas están funcionando bien. Estoy en el punto donde quiero asegurar la API.

Puse el atributo [Autorizar] sobre mi controlador base y funciona correctamente si quiero hacer llamadas a la API dentro de la propia aplicación ASP.NET.

Sin embargo, me pregunto, ¿cuál es la mejor práctica para un cliente externo que desea hacer llamadas a la API y pasar la autorización? Además, teniendo en cuenta que tengo lógica de autenticación personalizada.

¿Cómo debe el cliente enviar credenciales? ¿En qué punto proceso estas credenciales?


Básicamente, querrá enviar el nombre de usuario y la contraseña cifrados a través de la red a su aplicación de servidor, luego puede permitir que su API genere una ID de sesión aleatoria y la mantenga en una lista (servidor) y envíe la ID de vuelta al cliente. Ahora, cada vez que su cliente envíe algo al servidor, incluya la identificación que recibió en los paquetes para que el servidor pueda verificarlo cada vez.

En la desconexión del cliente o el tiempo de espera fijo, puede eliminar la ID de la lista de servidores y pedirle al cliente que vuelva a autenticarse.


¿Cómo debo enviar las credenciales del cliente?

La ubicación predeterminada para enviar información de autenticación es el encabezado de autorización . Puede usar esto para la autenticación básica pero también para otros tipos de autenticación (JWT, Portador, etc.).

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Para agregar, por ejemplo, un encabezado de autenticación básico a su solicitud, puede usar el siguiente código en su cliente:

WebRequest request = (HttpWebRequest)WebRequest.Create("https://yoururl"); request.Headers.Add(HttpRequestHeader.Authorization, "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("user:password")));

¿En qué punto proceso estas credenciales?

Yo escribiría un DelegatingHandler y lo usaría para resolver su "principal". Luego puede configurarlo en HttpContext.CurrentPrincipal para tenerlo disponible donde lo necesite dentro del alcance de la solicitud. Como se ve en la imagen de abajo, se llama a DelegatingHandler antes que a sus controladores, lo que lo hace ideal para la lógica de autenticación.

Haría lo mismo en el cliente (escriba un DelegatingHandler o ActionFilterAttribute ) para agregar el encabezado de autenticación en una ubicación predeterminada. Tenga en cuenta que DelegatingHandler s es parte de la canalización HTTP y ActionFilterAttribute s pertenece a la canalización MVC.

Por último, pero no menos importante, recomendaría no escribir su propia lógica de autenticación personalizada, pero seguir con uno de los marcos predeterminados. Esto puede ser tan fácil como usar la autenticación básica a través de HTTPS y tan complicado como implementar OAuth. Pero me mantendría alejado de hacerlo por ti mismo soluciones.

También me gustaría invitarte a echar un vistazo a esta respuesta que di a una pregunta similar.

Nota: ASP.NET Web Api está basado en REST, así que no querrá mantener la información de la sesión.

Edición: para ver un ejemplo sobre cómo implementar un administrador de delegación que maneja la autenticación básica, consulte: autenticación http básica en la API de asp.net web mediante controladores de mensajes.