Ne pas exposer publiquement votre Web API

Dans le cadre d’un de mes projets, l’application Web (déployée dans une Web App sur Azure) devait consommer un Web API (déployé dans une autre Web App sur Azure). Toutefois, le Web API ne devait pas être exposé sur Internet.
C’est mon ami Mike Lapierre qui m’a expliqué comment faire. J’ai donc consigné la recette et je la partage avec toi aujourd’hui.
Pour cela, nous allons commencer par développer une application d’exemple.

L’application d’exemple

Pour illustrer le cas de figure, j’ai développé une application toute simple:
  • Un projet ASP.NET Web API: qui retourne une valeur aléatoire lorsqu’on fait un HTTP Get sur l’URL “api/randomvalue”;
  • Un projet ASP.NET MVC: qui appelle le Web API via un HTTP Get et affiche la valeur aléatoire retournée. L’appel se fait de façon habituelle, en utilisant un HttpClient.
Le code est disponible sur mon GitHub.

Déploiement de l’application d’exemple sur Azure

J’ai déployé le Web API sur une Web App Azure nommée “RandomNumberApi” et j’ai déployé le site MVC sur une Web App Azure nommée “FrontSiteWeb”.
Je ne détaillerai pas ici les différentes options de déploiement des Web Apps sur Azure, car c’est hors de la portée de cet article.
webapps déployées sur Azure
Si j’accède à mon site web, je vois que j’obtiens bien le résultat attendu:
accès à la web app front end
Par contre, si j’invoque le Web API, je vois que je peux l’atteindre aussi:
accès au web api

Restriction de qui peut appeler le Web API

En résumé, il s’agit d’indiquer à la Web App hébergeant le Web API quelles sont les adresses IP autorisées à l’appeler. Dans ce cas, ce sont celles de la Web App hébergeant le site web.
Pour ce faire, on commence par déterminer les adresses IP de la Web App hébergeant le site web. Pour cela, on va dans la section “Properties” de cette Web App et on copie les valeurs du champs “Outbound IP Addresses”:
obtenir les outbound ip addresses
On indique ensuite à la Web App hébergeant le Web API que seules ces adresses IP sont autorisées à l’appeler. Pour cela, on va dans la section “Networking” de cette Web App et on clique sur “Configure Access Restrictions”:
configurer les restrictions d'accès 1 sur 3
On clique ensuite sur “Add Rule” et on renseigne les informations demandées:
configurer les restrictions d'accès 2 sur 3
Étant donné que la liste des outbound IP contient 4 adresses IP, on crée 4 règles:
configurer les restrictions d'accès 3 sur 3

À présent, si j’accède à mon site web, je vois que j’obtiens bien le résultat attendu:

on a encore accès à la web app front end
Par contre, si j’invoque le Web API, je vois que je ne peux plus l’atteindre :

mais on n'a plus accès à la web app du web api

La page d’erreur n’est, certes, pas adéquate (ça doit être la page d’erreur standard pour les erreurs HTTP 403). Toutefois, si tu regardes dans la console JavaScript, tu verras que le status de l’erreur est bien “Ip Forbidden”.

En conclusion…

Même si tu déploies ton Web API sur Azure, il n’est pas nécessaire de l’exposer publiquement. Parfois, tu veux qu’il ne soit accessible que par tes autres services. C’est ce que nous avons vu ensemble aujourd’hui.

 

À la prochaine !

Comments are closed.