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 muestra cómo usar la autenticación básica para proteger el acceso a los recursos del servicio web RESTful.

Nota

En iOS 9 y versiones posteriores, App Transport Security (ATS) exige conexiones seguras entre recursos de Internet (como el servidor back-end de la aplicación) y la aplicación, lo que evita 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, se producirá un error con una excepción. ATS puede optar por no participar si no es posible usar el HTTPS protocolo 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 App Transport Security.

Autenticación de usuarios a través de HTTP

La autenticación básica es el mecanismo de autenticación más sencillo admitido por HTTP e implica que el cliente envía el 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:

Error de autenticación básica

  • Si un servicio web recibe una solicitud de un recurso protegido, con el Authorization encabezado 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:

Autenticación básica correcta

Nota

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

Especificar 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 Authorization encabezado 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 Authorization encabezado de la solicitud.

Por lo tanto, con un nombre de usuario de "XamarinUser" y una contraseña de "XamarinPassword", el encabezado se convierte en:

Authorization: Basic WGFtYXJpblVzZXI6WGFtYXJpblBhc3N3b3Jk

La HttpClient clase puede establecer el valor de Authorization encabezado en la HttpClient.DefaultRequestHeaders.Authorization propiedad . Dado que la HttpClient instancia existe en varias solicitudes, el Authorization encabezado solo debe establecerse una vez, en lugar de 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 Authorization encabezado , lo que indica si el usuario tiene permiso para invocar la operación.

Importante

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

Procesamiento del lado servidor del encabezado de autorización

El servicio REST debe decorar cada acción con el [BasicAuthentication] atributo . Este atributo se usa para analizar el Authorization encabezado y determinar si las credenciales codificadas en base64 son válidas comparándolas con los valores almacenados en Web.config. Aunque este enfoque es adecuado para un servicio de ejemplo, requiere la extensión de un servicio web orientado al público.

En el módulo de autenticación básica que usa 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 obtener 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 inicio de sesión. Por lo tanto, el enfoque de autenticación básica estándar para cerrar sesión es finalizar la sesión.