web-dev-qa-db-fra.com

Authentification de l'API Web ASP.NET

J'ai créé une nouvelle API Web ASP.NET et les choses fonctionnent bien. J'en suis maintenant au point où je veux sécuriser l'API.

Je mets l'attribut [Autoriser] au-dessus de mon contrôleur de base et cela fonctionne correctement si je veux faire des appels d'API dans l'application ASP.NET elle-même.

Cependant, je me demande quelle est la meilleure pratique pour un client externe qui souhaite passer des appels d'API et dépasser l'autorisation? Aussi, en gardant à l'esprit que j'ai une logique d'authentification personnalisée.

Comment le client doit-il envoyer ses informations d'identification? À quel moment dois-je traiter ces informations d'identification?

20
Adam Levitt

Comment dois-je envoyer les informations d'identification du client?

L'emplacement par défaut pour envoyer les informations d'authentification est l'en-tête autorisation. Vous pouvez l'utiliser pour l'authentification de base mais aussi pour d'autres types d'authentification (JWT, Bearer, etc.).

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Pour ajouter, par exemple, un en-tête d'authentification de base à votre demande, vous pouvez utiliser le code suivant sur votre client:

WebRequest request = (HttpWebRequest)WebRequest.Create("https://yoururl");
request.Headers.Add(HttpRequestHeader.Authorization, "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("user:password")));

À quel moment dois-je traiter ces informations d'identification?

Je voudrais écrire un DelegatingHandler et l'utiliser pour résoudre votre "principal". Vous pouvez ensuite le définir sur HttpContext.CurrentPrincipal pour qu'il soit disponible partout où vous en avez besoin dans le cadre de la demande. Le DelegatingHandler est appelé avant vos contrôleurs comme vous pouvez le voir dans l'image ci-dessous, ce qui le rend idéal pour la logique d'authentification.

enter image description here

Je ferais la même chose sur le client (écrivez un DelegatingHandler ou ActionFilterAttribute) pour ajouter l'en-tête d'authentification sur un emplacement par défaut. Notez que DelegatingHandlers font partie du pipeline HTTP et ActionFilterAttributes appartiennent au pipeline MVC.

Enfin, je recommanderais de ne pas écrire votre propre logique d'authentification personnalisée, mais de vous en tenir à une des structures par défaut. Cela peut être aussi simple que d'utiliser l'authentification de base sur HTTPS et aussi compliqué que d'implémenter OAuth. Mais je resterais loin des solutions faites-le vous-même.

Je voudrais également vous inviter à jeter un coup d'œil à cette réponse J'ai donné une question similaire.

Remarque: ASP.NET Web Api est REST basé, donc à mon humble avis vous ne voulez pas du tout conserver les informations de session.

Edit: Pour un exemple sur la façon d'implémenter un gestionnaire de délégation qui gère l'authentification de base, voir: authentification http de base dans asp.net web api using message gestionnaires.

20
Jos Vinke

Fondamentalement, vous voudrez envoyer le nom d'utilisateur et le mot de passe cryptés sur le net à votre application serveur, puis vous pouvez laisser votre API générer un ID de session aléatoire et le conserver dans une liste (côté serveur) et renvoyer l'ID au client. Maintenant, chaque fois que votre client envoie quelque chose au serveur, incluez l'ID qu'il a reçu dans les paquets et ainsi le serveur pourra le vérifier à chaque fois.

Lors de la déconnexion du client ou d'un délai fixe, vous pouvez supprimer l'ID de la liste des serveurs et demander au client de s'authentifier à nouveau.

3
Chuk Ultima