Autenticar um serviço Web RESTful

O HTTP dá suporte ao uso de vários mecanismos de autenticação para controlar o acesso aos recursos. A autenticação básica fornece acesso aos recursos somente aos clientes que têm as credenciais corretas. Este artigo demonstra como usar a autenticação básica para proteger o acesso aos recursos do serviço Web RESTful.

Observação

No iOS 9 e superior, a ATS (Segurança de Transporte de Aplicativo) impõe conexões seguras entre recursos da Internet (como o servidor de back-end do aplicativo) e o aplicativo, impedindo assim a divulgação acidental de informações confidenciais. Como o ATS está habilitado por padrão em aplicativos criados para o iOS 9, todas as conexões estarão sujeitas aos requisitos de segurança do ATS. Se as conexões não atenderem a esses requisitos, elas falharão com uma exceção. A ATS poderá ser recusada se não for possível usar o HTTPS protocolo e a comunicação segura para recursos da Internet. Isso pode ser feito atualizando o arquivo Info.plist do aplicativo. Para obter mais informações , consulte Segurança de Transporte de Aplicativo.

Autenticando usuários por HTTP

A autenticação básica é o mecanismo de autenticação mais simples com suporte por HTTP e envolve o cliente enviando o nome de usuário e a senha como texto codificado em base64 não criptografado. Ele funciona da seguinte maneira:

  • Se um serviço Web receber uma solicitação para um recurso protegido, ele rejeitará a solicitação com um http status código 401 (acesso negado) e definirá o cabeçalho de resposta WWW-Authenticate, conforme mostrado no diagrama a seguir:

Falha na autenticação básica

  • Se um serviço Web receber uma solicitação para um recurso protegido, com o Authorization cabeçalho definido corretamente, o serviço Web responderá com um http status código 200, o que indica que a solicitação foi bem-sucedida e que as informações solicitadas estão na resposta. Esse cenário é mostrado no seguinte diagrama:

Autenticação Básica com êxito

Observação

A autenticação básica só deve ser usada em uma conexão HTTPS. Quando usado em uma conexão HTTP, o Authorization cabeçalho pode ser facilmente decodificado se o tráfego HTTP for capturado por um invasor.

Especificando a autenticação básica em uma solicitação da Web

O uso da autenticação básica é especificado da seguinte maneira:

  1. A cadeia de caracteres "Basic" é adicionada ao Authorization cabeçalho da solicitação.
  2. O nome de usuário e a senha são combinados em uma cadeia de caracteres com o formato "nome de usuário:senha", que é codificado em base64 e adicionado ao Authorization cabeçalho da solicitação.

Portanto, com um nome de usuário de 'XamarinUser' e uma senha de 'XamarinPassword', o cabeçalho se torna:

Authorization: Basic WGFtYXJpblVzZXI6WGFtYXJpblBhc3N3b3Jk

A HttpClient classe pode definir o valor do Authorization cabeçalho na HttpClient.DefaultRequestHeaders.Authorization propriedade . Como a HttpClient instância existe em várias solicitações, o Authorization cabeçalho só precisa ser definido uma vez, em vez de fazer cada solicitação, conforme mostrado no exemplo de código a seguir:

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);
  }
  ...
}

Em seguida, quando uma solicitação é feita a uma operação de serviço Web, a solicitação é assinada com o Authorization cabeçalho, indicando se o usuário tem ou não permissão para invocar a operação.

Importante

Embora esse código armazene credenciais como constantes, elas não devem ser armazenadas em um formato inseguro em um aplicativo publicado.

Processando o lado do servidor de cabeçalho de autorização

O serviço REST deve decorar cada ação com o [BasicAuthentication] atributo . Esse atributo é usado para analisar o Authorization cabeçalho e determinar se as credenciais codificadas em base64 são válidas comparando-as com valores armazenados em Web.config. Embora essa abordagem seja adequada para um serviço de exemplo, ela requer a extensão para um serviço Web voltado para o público.

No módulo de autenticação básica usado pelo IIS, os usuários são autenticados em suas credenciais do Windows. Portanto, os usuários devem ter contas no domínio do servidor. No entanto, o modelo de autenticação básica pode ser configurado para permitir a autenticação personalizada, em que as contas de usuário são autenticadas em uma fonte externa, como um banco de dados. Para obter mais informações, consulte Autenticação Básica em ASP.NET Web API no site do ASP.NET.

Observação

A autenticação básica não foi projetada para gerenciar o logon. Portanto, a abordagem de autenticação básica padrão para fazer logon é encerrar a sessão.