Bonjour à tous, j’aimerais avoir votre avis sur un problématique que vais rencontrer très prochainement.
Jusqu’à maintenant, tous les services WCF que j’ai développés l’ont été dans le cadre de services internes/privés (et donc facilement isolable).
Pour un projet personnel je vais avoir besoin d’héberger un service WCF sur le Web afin qu’il puisse être consommé par une application WinRT, une application Windows Phone et à terme un client léger (très certainement un site ASP MVC).
Pour ce qui est de la sécurité du transport, je sais qu’il est primordial que je passe par un canal sécurisé (certificat SSL), là-dessus on est d’accord. Maintenant, comment géreriez-vous le scénario suivant :
- Un utilisateur se connecte dans l’application (WinRT ou WP8), ce qui se traduit par l’appel de la méthode Login (qui voit la propriété IsInitiating de son attribut OperationContract à true) et donc l’ouverture d’une session dans mon service WCF (typiquement, je regarde si le couple login/hash existe dans ma BDD auquel cas je retourne à l’application l’entité User qui correspond).
- A partir de là, et si la connexion a réussi, mon utilisateur a potentiellement accès à toutes les méthodes de mon service via l’interface de mon application.
- Parmi les méthodes appelables il en existe une qui nécessite que l’utilisateur fasse un achat in-app. En somme, c’est seulement si les serveurs de Microsoft valident la transaction que l’utilisateur a accès à un bouton de mon application qui permet l’appel à une méthode précise de mon service.
- Et c’est là que le bât blesse, si un développeur mal intentionné se décide de développer une application personnelle qui consomme mon service il aura le loisir d’appeler n’importe quelle méthode de mon service.
J’ai cru comprendre qu’il n’était pas possible d’identifier nativement quel est le client qui appelle le service (ce qui me parait plutôt logique). J’ai donc pensé à un truc assez naïf ; avoir côté service une clé qui authentifie le client appelant. Grossièrement, le client envoi au moment du Login une clé qui est vérifiée côté service, si cette clé n’existe pas/est invalide le canal est immédiatement fermé.
Est-ce que ma méthode est viable ? (au-delà du fait qu’une application WinRT et WP8 peut facilement être décompilée, et que de fait la clé voir l’algo de génération de clé peut facilement tomber dans de mauvaises mains).
Partager