una seguridad segura por parte net construyendo con basada autenticacion asp.net-web-api basic-authentication restful-authentication

asp.net-web-api - seguridad - web api rest c#



ASP.net Web API RESTful servicio web+autenticación básica (3)

Echa un vistazo aquí para una buena implementación de autenticación básica

http://leastprivilege.com/2013/04/22/web-api-security-basic-authentication-with-thinktecture-identitymodel-authenticationhandler/

hay más para leer al respecto en: https://github.com/thinktecture/Thinktecture.IdentityModel.45/wiki

Estoy implementando un servicio web RESTful utilizando ASP.Net Web Api. He llegado a la conclusión de utilizar autenticación básica + SSL para hacer la parte de autenticación. ¿Cuál es la mejor / forma correcta de implementar eso?

Mi primer intento fue hacerlo manualmente, analizar el encabezado Authorization, descodificar y verificar al usuario en mi base de datos. Funciona, pero me pregunto si me está perdiendo algo.

He visto algunas soluciones usando roles de usuario y principales. Aunque no estoy seguro de qué es lo que realmente hacen, estoy casi seguro de que no los necesitaré, ya que en mi base de datos defino a mis propios usuarios y sus funciones.

Además, lo que aún no entiendo del todo es si los consumidores del servicio deben enviar las credenciales con cada solicitud o si están de alguna manera en la memoria caché. ¿Mi servicio debe hacer algo para que esto suceda, o depende completamente del consumidor manejar esto?

Y una última pregunta sobre los clientes que hacen solicitudes con javascript. ¿Habrá algún problema de "solicitud de dominio cruzado" si intentan usar el servicio?


Jamie Kurtze proporciona una buena explicación sobre el uso de la Autenticación básica aquí ASP.NET Web API REST Fundamentos de seguridad

Según entiendo, si desea que sus solicitudes sean apátridas, entonces cada solicitud requerirá que se establezca el campo Autenticación

Jamie Kurtze envuelve el código necesario en una clase derivada de DelegateHandler, mientras que Rick Strahl verifica si la llamada es válida usando un filtro. Puede leer más en su publicación de blog sobre este tema en Un filtro de autorización de autenticación básica de WebAPI


Utilice la autenticación básica para la solicitud inicial (inicio de sesión) agregando un atributo [BasicHttpAuthorize] a los controladores / métodos apropiados. Especifique los Users y Roles con el atributo si lo desea. Defina BasicHttpAuthorizeAttribute como un AuthorizeAttribute especializado como este:

public class BasicHttpAuthorizeAttribute : AuthorizeAttribute { protected override bool IsAuthorized(HttpActionContext actionContext) { if (Thread.CurrentPrincipal.Identity.Name.Length == 0) { // If an identity has not already been established by other means: AuthenticationHeaderValue auth = actionContext.Request.Headers.Authorization; if (string.Compare(auth.Scheme, "Basic", StringComparison.OrdinalIgnoreCase) == 0) { string credentials = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(auth.Parameter)); int separatorIndex = credentials.IndexOf('':''); if (separatorIndex >= 0) { string userName = credentials.Substring(0, separatorIndex); string password = credentials.Substring(separatorIndex + 1); if (Membership.ValidateUser(userName, password)) Thread.CurrentPrincipal = actionContext.ControllerContext.RequestContext.Principal = new GenericPrincipal(new GenericIdentity(userName, "Basic"), System.Web.Security.Roles.Provider.GetRolesForUser(userName)); } } } return base.IsAuthorized(actionContext); } }

Haga que la respuesta inicial incluya una clave API para el usuario. Use la tecla API para llamadas posteriores. De esta forma, la autenticación del cliente sigue siendo válida incluso si el usuario cambia el nombre de usuario o la contraseña. Sin embargo, al cambiar la contraseña, brinde al usuario la opción de "desconectar clientes", que implementará al eliminar la clave API en el servidor.