web-dev-qa-db-fra.com

Où stocker les jetons d'accès et d'actualisation sur l'application Web du client ASP.NET - appel d'une API REST

J'ai créé une API Web dans ASP.NET qui sert de point d'entrée dans une base de données SQL Server pour les données de rapport. Ce service possède un point de terminaison "token" qui authentifie un utilisateur via ASP Identity et renvoie un accès de 20 minutes et un jeton de rafraîchissement de 2 semaines.

Cette API ne doit être accessible que via nos propres applications et produits. Nous allons écrire une Android, application iOS et application Web ASP.NET qui s'authentifiera et obtiendra les données de cette API Web décrite ci-dessus. Je serai responsable de l'ASP. Application Web client NET et l'API. Nous construisons ces applications toutes en interne pour que nos clients puissent se connecter et utiliser. Aucun tiers en dehors de mon entreprise n'appellera notre API via l'une de leurs propres applications.

Pour mon application Web client ASP.NET, je l'écris dans ASP.NET MVC et elle n'a pas vraiment de base de données pour l'instant car elle communique avec l'API pour tout.

J'ai commencé avec cela comme base, et cela fonctionne ... mais maintenant je dois convertir ce fichier HTML en une application Web ASP.NET dans MVC et savoir où et comment stocker le jeton d'accès et actualiser les jetons. http://blog.rfaisal.com/2014/01/14/building-your-own-api-and-securing-it-with-oauth-2-0-in-asp-net-webapi- 2 /

Mes questions sont:

  1. Je comprends que je devrai passer le jeton d'accès dans les appels suivants à l'API pour effectuer des opérations CRUD. Où dois-je faire ma demande Web pour authentifier l'utilisateur sur l'application Web lors de la connexion ... à partir du code C # derrière ou JavaScript comme dans le tutoriel référencé ci-dessus? Je demande parce que je me rends compte que j'aurai besoin du jeton d'accès dans mes appels JS Ajax, mais j'ai entendu dire que le le jeton d'actualisation doit être plus "sécurisé" et les appels à partir du code du serveur pourraient me donner des options plus sécurisées pour le faire ??

  2. Où dois-je stocker le jeton d'accès? Dans un cookie créé en JavaScript ou sur le serveur? Dans le stockage local JavaScript? Dans une variable de session que je peux transmettre au JavaScript peut-être?

  3. Où dois-je stocker le jeton d'actualisation? J'en aurai besoin pour renouveler le jeton d'accès avant son expiration. J'ai recherché cela sur Google, mais je ne trouve pas de bonne solution ASP.NET en ligne qui me dise où ou comment le stocker du point de vue de mon application Web consommatrice. Un cookie créé à partir du serveur, enregistré dans une base de données SQL utilisée par l'application Web, dans une variable de session?

J'ai désespérément besoin d'aide, ce qui me rend fou et me tient éveillé la nuit. J'espère que quelqu'un pourra fournir un exemple simple et complet et décrire pleinement ce que je dois faire.

19
Andy DesRosiers

1. Où authentifier l'utilisateur?

Si c'est un utilisateur qui doit s'authentifier, vous avez besoin de quelque chose dans votre frontal. Depuis votre front-end, vous pouvez simplement faire un POST sur votre back-end, avec les informations d'identification de l'utilisateur. Vous vérifiez les informations d'identification de l'utilisateur et émettez une paire accesstoken/refreshtoken au cas où les informations d'identification sont connu. Vous devrez TOUJOURS passer par le serveur principal pour authentifier un utilisateur. Vous mentionnez que le didacticiel le fait dans JS, mais il ne le fait pas. Il POSTE sur un formulaire de connexion. Le POST = est lancé dans JS, mais il va au back-end.

2. Où dois-je stocker le jeton d'accès?

Le jeton d'accès peut être stocké de la même manière que les cookies d'authentification normaux sont stockés. Vous disposez de plusieurs options (cookie sécurisé uniquement http, stockage local, stockage de session, etc.). Dans le scénario le plus simple, il vous suffit de le stocker dans un cookie afin qu'il soit envoyé avec chaque demande. Cependant, pour une application mobile, il est probablement plus facile de la stocker dans LocalStorage.

3. Où dois-je stocker le rafraîchissement?

Cela dépend fortement de votre application. I a posé la même question il y a quelque temps, pour les applications mobiles (assurez-vous de lire également les commentaires). Vous devez stocker le rafraîchissement dans un endroit sûr. Pour les applications que vous développerez, vous pouvez suivre les suggestions de la réponse à laquelle j'ai lié, à savoir:

  • Stockez le rafraîchissement dans LocalStorage
  • Stockez le rafraîchissement chiffré quelque part sur le système de fichiers, à l'aide d'une API fournie par Android/IOS. Stockez la clé de chiffrement dans le stockage local. (ou l'inverse).

Pour d'autres types d'applications, d'autres possibilités existent. Stocker à la fois le jeton d'accès et le jeton de rafraîchissement dans LocalStorage peut sembler faux du point de vue de la sécurité, mais un attaquant aura probablement plus de chance d'intercepter le jeton lorsqu'il est en transit que d'avoir accès au localstorage. D'autres suggestions, parfois plus exotiques, sont données ici (par exemple IOS stockage sécurisé).

Informations supplémentaires

  • Personnellement, j'aime cette série d'articles de blog beaucoup. Soyez conscient, ils peuvent commencer à devenir un peu obsolètes, mais ils contiennent une mine d'informations concernant une configuration REST-OWIN.
  • N'oubliez pas de mettre en œuvre tous les autres contrôles de sécurité, que je n'ai pas mentionnés car cela nuirait à la réponse. HTTPS, les cookies http uniquement, les cookies sécurisés, les empêchements XSS, etc. doivent être implémentés, ou votre jeton sera volé beaucoup plus rapidement que le temps dont vous avez besoin pour lire cette réponse.
13
Michael