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 superior, 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. Puesto que ATS está habilitado de forma predeterminada en las aplicaciones creadas 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. SE puede rechazar ATS si no es posible usar el protocolo y proteger HTTPS la comunicación con los recursos de Internet. Esto se puede lograr actualizando el archivo Info.plist de la aplicación. Para obtener más información, vea 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 compatible con HTTP e implica que el cliente envíe 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 encabezado establecido correctamente, el servicio web responde con un código de estado HTTP 200, que indica que la solicitud se ha hecho correctamente y que la información solicitada está en la Authorization respuesta. Este escenario se muestra en el diagrama siguiente:

Autenticación básica correcta

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 se puede descodificar fácilmente si un atacante captura el tráfico Authorization 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 se codifica en base64 y se agrega al encabezado de Authorization 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 encabezado en la propiedad AuthorizationHttpClient.DefaultRequestHeaders.Authorization . Dado que la instancia existe en varias solicitudes, el encabezado solo debe establecerse una vez, en lugar de al realizar cada solicitud, como se muestra en el HttpClientAuthorization 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 , lo que indica si el usuario tiene permiso para Authorization 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 del servidor de encabezados de autorización

El servicio REST debe decorar cada acción con el [BasicAuthentication] atributo . Este atributo se usa para analizar el encabezado y determinar si las credenciales codificadas en Base64 son válidas comparándolos con los valores almacenados AuthorizationAuthorization. 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 Windows credenciales. 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 ASP.NET web.

Nota:

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