Comment démarrer avec OAuth pour sécuriser une application API Web?

J’ai une application Web API et j’ai compris qu’OAuth serait le modèle de sécurité standard pour les API où un serveur d’authentification deviendrait responsable de la génération des jetons d’autorisation afin que l’utilisateur puisse envoyer à notre serveur et utiliser les services.

Je suis très novice dans ce domaine mais je comprends les rôles:

  • Propriétaire de la ressource
  • Client
  • Serveur de ressources
  • Serveur d’autorisation

Mais qu’est-ce qu’OAuth en pratique, pas en théorie Est-ce une bibliothèque .NET? Est-ce un service fourni par une société distincte? Est-ce quelque chose que je peux configurer sur ma machine de développement locale et voir comment cela fonctionne?

Comment démarrer avec OAuth pour sécuriser une application Web API?

OAuth est un protocole. la version actuelle est OAuth 2.0 . Plus à votre question, ce lien répertorie plusieurs implémentations du protocole dans diverses technologies. Pour une utilisation avec l’API Web .NET, vous êtes probablement intéressé par DotNetOpenAuth, qui fournit des implémentations d’OAuth 1 et d’OAuth 2.

J’utilise DotNetOpenAuth dans une application sur laquelle je travaille actuellement pour sécuriser une API Web .NET. J’ai un OAuth2Handler qui étend DelegatingHandler qui est inséré dans le pipeline de l’API Web avant que les demandes entrantes atteignent les contrôleurs. OAuth2Handler effectue les opérations suivantes:

  1. Instancie un serveur de ResourceServer DotNetOpenAuth
  2. Appelle ResourceServer.GetPrincipal() qui lit et déchiffre un jeton d’access (émis ailleurs par AuthorizationServer et renvoie un OAuthPrincipal (dans mon cas, je lis des données supplémentaires que l’implémentation DotNetOpenAuth vous permet de transmettre et de créer un ClaimsPrincipal .)
  3. Affectation de la IPrincipal contenant les informations utilisateur lues à partir du jeton d’access à la propriété User du thread et au contexte HTTP actuel de sorte qu’elle soit disponible à partir de la propriété ApiController.User dans les contrôleurs de service: httpContext.User = Thread.CurrentPrincipal = principal;

Honnêtement, faire en sorte que tout fonctionne correctement (par exemple, la configuration du serveur d’autorisation, du serveur de ressources, des certificates, etc.) n’est pas sortingvial. Malheureusement, il ne semblait pas y avoir de bon guide sur le site DotNetOpenAuth. Voici quelques autres tâches que vous aurez devant vous si vous suivez cette voie:

  • Implement IAuthorizationServer – C’est l’interface fournie par DotNetOpenAuth qui vous permet de vous connecter à la bibliothèque et d’utiliser son implémentation pour émettre des jetons d’access OAuth2. Vous devrez également implémenter INonceStore et ICryptoKeyStore ce que j’ai fait en utilisant un contexte EntityFramework pour le stockage.
  • Configurer les certificatesAuthorizationServer et ResourceServer utilisent chacun des certificates pour chiffrer / déchiffrer le jeton d’access, en s’assurant qu’ils sont uniquement accessibles l’un à l’autre. J’ai construit une configuration personnalisée pour pouvoir gérer cette configuration dans les fichiers web.config de mon application de serveur d’permissions et mes services d’API Web (serveur de ressources).
  • Gestion du jeton d’actualisation – Lorsque vous demandez un jeton d’access au serveur d’autorisation pour la première fois, vous récupérez (en fonction de votre configuration) un jeton d’actualisation OAuth2 et un jeton d’access. Les services utilisent le jeton d’access qui devrait être de courte durée. Le jeton d’actualisation est utilisé pour obtenir plus de jetons d’access. Le jeton d’actualisation doit restr secret (peu importe ce que cela signifie dans votre scénario). Pour moi, cela signifie que le jeton d’actualisation n’est jamais exposé au javascript côté client dans mon application Web.

J’espère que cela vous aidera à mieux comprendre comment démarrer avec OAuth et l’API Web .NET. Voici un article de blog illustrant certaines de ces étapes. Cette réponse SO donne quelques détails supplémentaires sur le côté client de l’image.

(La documentation en ligne DotNetOpenAuth semble être en panne en ce moment … désolé de ne pas avoir de liens; apparemment, cela est déjà arrivé ).