Authentification Live avec une application Windows 8 côté serveur

Lors de la création d’une application Windows 8 utilisant des services WCF, il peut être nécessaire d’authentifier l’utilisateur à la fois côté client et côté serveur. Dans ce cas, il faut avoir un moyen d’identifier l’utilisateur côté serveur pour lui donner accès ou non aux ressources du service qu’il souhaite utiliser.
Pour ce faire je vais utiliser le Sdk Live qui est disponible à cette adresse : http://www.microsoft.com/en-us/download/details.aspx?id=35754
L’objectif étant d’authentifier notre utilisateur, je vais me baser sur le mail associé au compte live de l’utilisateur. Pour cela je vais récupérer un jeton d’accès côté client pour le donner ensuite en paramètre à mon service. Ce jeton me permettra ainsi côté service de requêter l’api Live pour vérifier si le mail du profil correspond bien au mail d’un des utilisateurs autorisés à utiliser l’application.
Pour illustrer cet exemple j’ai créé une application qui contient le projet d’une application Windows 8 ainsi qu’un projet WCF. Les sources du projet sont disponibles à l’adresse suivante : https://github.com/Cellenza/BLOG-LiveAuth
Important : j’ai retiré l’association du projet au Windows Store, il faut donc la recréer avec votre propre application pour que l’exemple fonctionne.
Association de l’application avec le Windows Store
La première étape consiste donc à créer l’application sur la Windows Store et à l’associer avec son projet dans Visual Studio.
- Connectez-vous avec votre compte Live et rendez-vous sur le Tableau de bord du store qui se trouve à l’adresse suivante : https://appdev.microsoft.com/StorePortals/fr-FR/Home/Index
- Créez l’application
- Maintenant dans Visual Studio, faites un clic droit sur le projet et allez dans le menu « Store » puis dans « Associate app with the store … »
- Dans la fenêtre qui s’ouvre cliquez sur « Sign in » et saisissez vos identifiants Live. Ensuite sélectionnez l’application que vous venez de créer.
- Terminez en cliquant sur « Next » et « Associate »
Récupération du jeton d’accès
La seconde étape correspond à récupérer le jeton d’accès en utilisant le Sdk Live. Voici le code qui permet de récupérer ce jeton :
Le point important à noter est de bien demander l’accès aux adresses emails (spécifié par le paramètre « wl.emails »). On retrouvera ensuite cette permission lors de l’exécution de l’application :
Utilisation du jeton pour obtenir les informations du compte
Pour ce faire je vais requêter directement l’api Live car le sdk ne permet pas d’effectuer cette opération. Pour cela il suffit d’utiliser notre jeton.
On récupère alors au format Json les informations relatives à l’utilisateur. Il ne reste plus qu’à comparer l’adresse email avec celle des utilisateurs autorisés pour savoir si l’on peut permettre ou non l’accès au service.
Remarque : l’utilisation de la classe HttpClient peut provoquer la levée d’une exception. Ce problème est bien expliqué à l’adresse suivante : http://stackoverflow.com/questions/13141434/httpclient-request-throws-ioexception
Pour le résoudre il faut modifier la base de registre à l’aide du code suivant :
Windows Registry Editor Version 5.00
; The following value prevents an IOException from being thrown and caught
; by System.Net.HybridWebProxyFinder.InitializeFallbackSettings() (in System.dll)
; when WebRequest.Create is first called. By default the “LegacyWPADSupport”
; value doesn’t exist, and when InitializeFallbackSettings calls GetValueKind,
; an IOException is thrown. This adds the value with its default of false to
; prevent the exception.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
“LegacyWPADSupport”=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]
“LegacyWPADSupport”=dword:00000000