Authentifier un service web RESTful
HTTP prend en charge l’utilisation de plusieurs mécanismes d’authentification pour contrôler l’accès aux ressources. L’authentification de base permet d’accéder aux ressources uniquement aux clients qui disposent des informations d’identification appropriées. Cet article montre comment utiliser l’authentification de base pour protéger l’accès aux ressources du service web RESTful.
Notes
Dans iOS 9 et versions ultérieures, App Transport Security (ATS) applique des connexions sécurisées entre les ressources Internet (telles que le serveur principal de l’application) et l’application, empêchant ainsi la divulgation accidentelle d’informations sensibles. Étant donné qu’ATS est activé par défaut dans les applications conçues pour iOS 9, toutes les connexions sont soumises aux exigences de sécurité ATS. Si les connexions ne répondent pas à ces exigences, elles échouent avec une exception.
ATS peut être exclu s’il n’est pas possible d’utiliser le protocole et la HTTPS
communication sécurisée pour les ressources Internet. Pour ce faire, vous pouvez mettre à jour le fichier Info.plist de l’application. Pour plus d’informations, consultez Sécurité du transport d’applications.
Authentification des utilisateurs sur HTTP
L’authentification de base est le mécanisme d’authentification le plus simple pris en charge par HTTP et implique que le client envoie le nom d’utilisateur et le mot de passe sous forme de texte encodé en base64 non chiffré. Elle fonctionne de la manière suivante :
- Si un service web reçoit une demande pour une ressource protégée, il rejette la requête avec un code HTTP status 401 (accès refusé) et définit l’en-tête de réponse WWW-Authenticate, comme illustré dans le diagramme suivant :
- Si un service web reçoit une demande pour une ressource protégée, avec l’en-tête
Authorization
correctement défini, le service web répond avec un code HTTP status 200, ce qui indique que la demande a réussi et que les informations demandées se situent dans la réponse. Ce scénario est illustré dans le diagramme suivant :
Notes
L’authentification de base doit uniquement être utilisée via une connexion HTTPS. Lorsqu’il est utilisé via une connexion HTTP, l’en-tête Authorization
peut facilement être décodé si le trafic HTTP est capturé par un attaquant.
Spécification de l’authentification de base dans une demande web
L’utilisation de l’authentification de base est spécifiée comme suit :
- La chaîne « De base » est ajoutée à l’en-tête
Authorization
de la requête. - Le nom d’utilisateur et le mot de passe sont combinés en une chaîne au format « username:password », qui est ensuite encodée en base64 et ajoutée à l’en-tête
Authorization
de la demande.
Par conséquent, avec un nom d’utilisateur « XamarinUser » et un mot de passe « XamarinPassword », l’en-tête devient :
Authorization: Basic WGFtYXJpblVzZXI6WGFtYXJpblBhc3N3b3Jk
La HttpClient
classe peut définir la valeur d’en-tête Authorization
sur la HttpClient.DefaultRequestHeaders.Authorization
propriété . Étant donné que le HttpClient
instance existe sur plusieurs demandes, l’en-tête Authorization
ne doit être défini qu’une seule fois, plutôt que lors de chaque requête, comme illustré dans l’exemple de code suivant :
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);
}
...
}
Ensuite, lorsqu’une demande est adressée à une opération de service web, la demande est signée avec l’en-tête Authorization
, indiquant si l’utilisateur a l’autorisation d’appeler l’opération.
Important
Bien que ce code stocke les informations d’identification sous forme de constantes, elles ne doivent pas être stockées dans un format non sécurisé dans une application publiée.
Traitement de l’en-tête d’autorisation côté serveur
Le service REST doit décorer chaque action avec l’attribut [BasicAuthentication]
. Cet attribut permet d’analyser l’en-tête Authorization
et de déterminer si les informations d’identification encodées en base64 sont valides en les comparant aux valeurs stockées dans Web.config. Bien que cette approche soit adaptée à un exemple de service, elle nécessite une extension pour un service web public.
Dans le module d’authentification de base utilisé par IIS, les utilisateurs sont authentifiés par rapport à leurs informations d’identification Windows. Par conséquent, les utilisateurs doivent avoir des comptes sur le domaine du serveur. Toutefois, le modèle d’authentification de base peut être configuré pour autoriser l’authentification personnalisée, où les comptes d’utilisateur sont authentifiés auprès d’une source externe, telle qu’une base de données. Pour plus d’informations, consultez Authentification de base dans API Web ASP.NET sur le site web ASP.NET.
Notes
L’authentification de base n’a pas été conçue pour gérer la déconnexion. Par conséquent, l’approche d’authentification de base standard pour la déconnexion consiste à mettre fin à la session.