Autenticare un servizio Web RESTful

HTTP supporta l'uso di diversi meccanismi di autenticazione per controllare l'accesso alle risorse. L'autenticazione di base consente l'accesso alle risorse solo ai client con le credenziali corrette. Questo articolo illustra come usare l'autenticazione di base per proteggere l'accesso alle risorse del servizio Web RESTful.

Nota

In iOS 9 e versioni successive, App Transport Security (ATS) applica connessioni sicure tra le risorse Internet (ad esempio il server back-end dell'app) e l'app, impedendo così la divulgazione accidentale di informazioni riservate. Poiché ATS è abilitato per impostazione predefinita nelle app compilate per iOS 9, tutte le connessioni saranno soggette ai requisiti di sicurezza di ATS. Se le connessioni non soddisfano questi requisiti, avranno esito negativo con un'eccezione. ATS può essere rifiutato esplicitamente se non è possibile usare il protocollo e proteggere la HTTPS comunicazione per le risorse Internet. A tale scopo, aggiornare il file Info.plist dell'app. Per altre informazioni, vedere App Transport Security.

Autenticazione degli utenti tramite HTTP

L'autenticazione di base è il meccanismo di autenticazione più semplice supportato da HTTP e prevede che il client invii il nome utente e la password come testo con codifica Base64 non crittografato. Il funzionamento è il seguente:

  • Se un servizio Web riceve una richiesta per una risorsa protetta, rifiuta la richiesta con un codice di stato HTTP 401 (accesso negato) e imposta l'intestazione della risposta WWW-Authenticate, come illustrato nel diagramma seguente:

Basic Authentication Failing

  • Se un servizio Web riceve una richiesta per una risorsa protetta, con l'intestazione Authorization impostata correttamente, il servizio Web risponde con un codice di stato HTTP 200, che indica che la richiesta è riuscita e che le informazioni richieste sono nella risposta. Questo scenario è illustrato nel diagramma seguente:

Basic Authentication Succeeding

Nota

L'autenticazione di base deve essere usata solo tramite una connessione HTTPS. Se usato tramite una connessione HTTP, l'intestazione Authorization può essere facilmente decodificata se il traffico HTTP viene acquisito da un utente malintenzionato.

Specifica dell'autenticazione di base in una richiesta Web

L'uso dell'autenticazione di base viene specificato come segue:

  1. La stringa "Basic" viene aggiunta all'intestazione Authorization della richiesta.
  2. Il nome utente e la password vengono combinati in una stringa con il formato "username:password", che viene quindi codificato in base64 e aggiunto all'intestazione Authorization della richiesta.

Di conseguenza, con un nome utente "XamarinUser" e una password di "XamarinPassword", l'intestazione diventa:

Authorization: Basic WGFtYXJpblVzZXI6WGFtYXJpblBhc3N3b3Jk

La HttpClient classe può impostare il valore dell'intestazione Authorization nella HttpClient.DefaultRequestHeaders.Authorization proprietà . Poiché l'istanza HttpClient esiste tra più richieste, l'intestazione Authorization deve essere impostata una sola volta, anziché quando si effettua ogni richiesta, come illustrato nell'esempio di codice seguente:

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

Quindi, quando viene effettuata una richiesta a un'operazione del servizio Web, la richiesta viene firmata con l'intestazione Authorization , che indica se l'utente ha o meno l'autorizzazione per richiamare l'operazione.

Importante

Anche se questo codice archivia le credenziali come costanti, non deve essere archiviato in un formato non sicuro in un'applicazione pubblicata.

Elaborazione del lato server di intestazione autorizzazione

Il servizio REST deve decorare ogni azione con l'attributo [BasicAuthentication] . Questo attributo viene usato per analizzare l'intestazione Authorization e determinare se le credenziali con codifica Base64 sono valide confrontandole con i valori archiviati in Web.config. Anche se questo approccio è adatto per un servizio di esempio, richiede l'estensione per un servizio Web pubblico.

Nel modulo di autenticazione di base usato da IIS gli utenti vengono autenticati con le credenziali di Windows. Pertanto, gli utenti devono avere account nel dominio del server. Tuttavia, il modello di autenticazione di base può essere configurato per consentire l'autenticazione personalizzata, in cui gli account utente vengono autenticati su un'origine esterna, ad esempio un database. Per altre informazioni, vedere Autenticazione di base in API Web ASP.NET nel sito Web di ASP.NET.

Nota

L'autenticazione di base non è stata progettata per gestire la disconnessione. Pertanto, l'approccio di autenticazione di base standard per la disconnessione consiste nel terminare la sessione.