Autenticar um serviço Web RESTfulAuthenticate a RESTful Web Service

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 a recursos somente para os 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.HTTP supports the use of several authentication mechanisms to control access to resources. Basic authentication provides access to resources to only those clients that have the correct credentials. This article demonstrates how to use basic authentication to protect access to RESTful web service resources.

Observação

No iOS 9 e superior, a ATS (segurança de transporte de aplicativo) impõe conexões seguras entre os recursos da Internet (como o servidor back-end do aplicativo) e o aplicativo, impedindo, assim, a divulgação acidental de informações confidenciais.In iOS 9 and greater, App Transport Security (ATS) enforces secure connections between internet resources (such as the app's back-end server) and the app, thereby preventing accidental disclosure of sensitive information. Como o ATS está habilitado por padrão em aplicativos criados para iOS 9, todas as conexões estarão sujeitas a requisitos de segurança de ATS.Since ATS is enabled by default in apps built for iOS 9, all connections will be subject to ATS security requirements. Se as conexões não atenderem a esses requisitos, elas falharão com uma exceção.If connections do not meet these requirements, they will fail with an exception. O ATS pode ser recusado se não for possível usar o HTTPS protocolo e a comunicação segura para recursos da Internet.ATS can be opted out of if it is not possible to use the HTTPS protocol and secure communication for internet resources. Isso pode ser feito atualizando o arquivo info. plist do aplicativo.This can be achieved by updating the app's Info.plist file. Para obter mais informações, consulte segurança do transporte de aplicativo.For more information see App Transport Security.

Autenticando usuários por HTTPAuthenticating Users over HTTP

A autenticação básica é o mecanismo de autenticação mais simples suportado pelo HTTP e envolve o cliente que envia o nome de usuário e a senha como texto codificado em base64 não criptografado.Basic authentication is the simplest authentication mechanism supported by HTTP, and involves the client sending the username and password as unencrypted base64 encoded text. Ele funciona da seguinte maneira:It works as follows:

  • Se um serviço Web receber uma solicitação de um recurso protegido, ele rejeitará a solicitação com um código de status HTTP 401 (acesso negado) e definirá o cabeçalho de resposta WWW-Authenticate, conforme mostrado no diagrama a seguir:If a web service receives a request for a protected resource, it rejects the request with an HTTP status code 401 (access denied) and sets the WWW-Authenticate response header, as shown in the following diagram:

  • Se um serviço Web receber uma solicitação de um recurso protegido, com o Authorization cabeçalho definido corretamente, o serviço Web responderá com um código de status HTTP 200, que indica que a solicitação foi bem-sucedida e que as informações solicitadas estão na resposta.If a web service receives a request for a protected resource, with the Authorization header correctly set, the web service responds with an HTTP status code 200, which indicates that the request succeeded and that the requested information is in the response. Esse cenário é mostrado no diagrama a seguir:This scenario is shown in the following diagram:

Observação

A autenticação básica só deve ser usada em uma conexão HTTPS.Basic authentication should only be used over an HTTPS connection. Quando usado em uma conexão HTTP, o Authorization cabeçalho poderá ser facilmente decodificado se o tráfego http for capturado por um invasor.When used over an HTTP connection, the Authorization header can easily be decoded if the HTTP traffic is captured by an attacker.

Especificando a autenticação básica em uma solicitação da WebSpecifying Basic Authentication in a Web Request

O uso da autenticação básica é especificado da seguinte maneira:Use of basic authentication is specified as follows:

  1. A cadeia de caracteres "Basic" é adicionada ao Authorization cabeçalho da solicitação.The string "Basic " is added to the Authorization header of the request.
  2. O nome de usuário e a senha são combinados em uma cadeia de caracteres com o formato "username: password", que é codificado em Base64 e adicionado ao Authorization cabeçalho da solicitação.The username and password are combined into a string with the format "username:password", which is then base64 encoded and added to the Authorization header of the request.

Portanto, com um nome de usuário de ' XamarinUser ' e uma senha de ' XamarinPassword ', o cabeçalho se torna:Therefore, with a username of 'XamarinUser' and a password of 'XamarinPassword', the header becomes:

Authorization: Basic WGFtYXJpblVzZXI6WGFtYXJpblBhc3N3b3Jk

A HttpClient classe pode definir o Authorization valor do cabeçalho na HttpClient.DefaultRequestHeaders.Authorization propriedade.The HttpClient class can set the Authorization header value on the HttpClient.DefaultRequestHeaders.Authorization property. Como a HttpClient instância existe em várias solicitações, o Authorization cabeçalho precisa ser definido apenas uma vez, em vez de ao fazer cada solicitação, conforme mostrado no exemplo de código a seguir:Because the HttpClient instance exists across multiple requests, the Authorization header needs only to be set once, rather than when making every request, as shown in the following code example:

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 permissão para invocar a operação.Then when a request is made to a web service operation the request is signed with the Authorization header, indicating whether or not the user has permission to invoke the operation.

Importante

Embora esse código armazene credenciais como constantes, elas não devem ser armazenadas em um formato não seguro em um aplicativo publicado.While this code stores credentials as constants, they should not be stored in an insecure format in a published application.

Processando o lado do servidor de cabeçalho de autorizaçãoProcessing the Authorization Header Server Side

O serviço REST deve decorar cada ação com o [BasicAuthentication] atributo.The REST service should decorate each action with the [BasicAuthentication] attribute. Esse atributo é usado para analisar o Authorization cabeçalho e determinar se as credenciais codificadas em base64 são válidas comparando-as com os valores armazenados em Web.config. Embora essa abordagem seja adequada para um serviço de exemplo, ela requer a extensão de um serviço Web voltado ao público.This attribute is used to parse the Authorization header and determine if the base64 encoded credentials are valid by comparing them against values stored in Web.config. While this approach is suitable for a sample service, it requires extending for a public-facing web service.

No módulo de autenticação básica usado pelo IIS, os usuários são autenticados em relação às suas credenciais do Windows.In the basic authentication module used by IIS, users are authenticated against their Windows credentials. Portanto, os usuários devem ter contas no domínio do servidor.Therefore, users must have accounts on the server's domain. 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.However, the Basic authentication model can be configured to allow custom authentication, where user accounts are authenticated against an external source, such as a database. Para obter mais informações, consulte autenticação básica em ASP.NET Web API no site ASP.net.For more information see Basic Authentication in ASP.NET Web API on the ASP.NET website.

Observação

A autenticação básica não foi projetada para gerenciar o logout. Portanto, a abordagem de autenticação básica padrão para fazer logoff é encerrar a sessão.Basic authentication was not designed to manage logging out. Therefore, the standard basic authentication approach for logging out is to end the session.