Autenticación de un servicio web RESTful

HTTP admite el uso de varios mecanismos de autenticación para controlar el acceso a los recursos. La autenticación básica proporciona acceso a los recursos solo a los clientes que tienen las credenciales correctas. En este artículo se explica cómo usar la autenticación básica para proteger el acceso a los recursos de un servicio web RESTful.

Nota:

En iOS 9 y versiones posteriores, App Transport Security (ATS) exige conexiones seguras entre los recursos de Internet (como el servidor back-end de la aplicación) y la aplicación, lo que impide la divulgación accidental de información confidencial. Dado que ATS está habilitado de forma predeterminada en las aplicaciones compiladas para iOS 9, todas las conexiones estarán sujetas a los requisitos de seguridad de ATS. Si las conexiones no cumplen estos requisitos, producirán un error con una excepción. ATS puede desactivarse si no es posible usar el protocolo HTTPS y la comunicación segura para los recursos de Internet. Esto se puede lograr actualizando el archivo Info.plist de la aplicación. Para obtener más información, consulte Seguridad de transporte de aplicación.

Autenticación de usuarios a través de HTTP

La autenticación básica es el mecanismo de autenticación más sencillo compartible con HTTP y consiste en el envío por parte del cliente del nombre de usuario y la contraseña como texto codificado en Base64 sin cifrar. Funciona como se indica a continuación:

  • Si un servicio web recibe una solicitud de un recurso protegido, rechaza la solicitud con un código de estado HTTP 401 (acceso denegado) y establece el encabezado de respuesta WWW-Authenticate, como se muestra en el diagrama siguiente:

Basic Authentication Failing

  • Si un servicio web recibe una solicitud de un recurso protegido, con el encabezado Authorization establecido correctamente, el servicio web responde con un código de estado HTTP 200, que indica que la solicitud se realizó correctamente y que la información solicitada está en la respuesta. Este escenario se muestra en el diagrama siguiente:

Basic Authentication Succeeding

Nota:

La autenticación básica solo debe usarse a través de una conexión HTTPS. Cuando se usa a través de una conexión HTTP, el encabezado Authorization se puede descodificar fácilmente si un atacante captura el tráfico HTTP.

Especificación de la autenticación básica en una solicitud web

El uso de la autenticación básica se especifica de la siguiente manera:

  1. La cadena "Basic" se agrega al encabezado Authorization de la solicitud.
  2. El nombre de usuario y la contraseña se combinan en una cadena con el formato "username:password", que luego se codifica en Base64 y se agrega al encabezado Authorization de la solicitud.

Por lo tanto, si el nombre de usuario fuera "XamarinUser" y la contraseña "XamarinPassword", el encabezado sería:

Authorization: Basic WGFtYXJpblVzZXI6WGFtYXJpblBhc3N3b3Jk

La clase HttpClient puede establecer el valor del encabezado Authorization en la propiedad HttpClient.DefaultRequestHeaders.Authorization. Dado que la instancia HttpClient existe en varias solicitudes, el encabezado Authorization solo debe establecerse una vez, y no al realizar cada solicitud, como se muestra en el ejemplo de código siguiente:

public class RestService : IRestService
{
  HttpClient _client;
  ...

  public RestService ()
  {
    var authData = string.Format ("{0}:{1}", Constants.Username, Constants.Password);
    var authHeaderValue = Convert.ToBase64String (Encoding.UTF8.GetBytes (authData));

    _client = new HttpClient ();
    _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue ("Basic", authHeaderValue);
  }
  ...
}

A continuación, cuando se realiza una solicitud a una operación de servicio web, la solicitud se firma con el encabezado Authorization, que indica si el usuario tiene o no permiso para invocar la operación.

Importante

Aunque este código almacena las credenciales como constantes, no deben almacenarse en un formato poco seguro en una aplicación publicada.

Procesamiento del lado servidor de encabezados de autorización

El servicio REST debe decorar cada acción con el atributo [BasicAuthentication]. Este atributo se usa para analizar el encabezado Authorization y determinar si las credenciales codificadas en Base64 son válidas, para lo cual se comparan con los valores almacenados en Web.config. Aunque este enfoque es adecuado para un servicio de ejemplo, será necesario ampliarlo en el caso de un servicio web orientado al público.

En el módulo de autenticación básica usado por IIS, los usuarios se autentican con sus credenciales de Windows. Por lo tanto, los usuarios deben tener cuentas en el dominio del servidor. Sin embargo, el modelo de autenticación básica se puede configurar para permitir la autenticación personalizada, donde las cuentas de usuario se autentican en un origen externo, como una base de datos. Para más información, consulte Autenticación básica en ASP.NET Web API en el sitio web de ASP.NET.

Nota:

La autenticación básica no se diseñó para administrar el cierre de sesión. Por lo tanto, el enfoque de autenticación básica estándar para cerrar sesión es finalizar la sesión.