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.

project application windows 8

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 »

associate your app

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 :

client side application windows 8

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 :

authorize live access application windows 8

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.

application windows 8 server side

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.

response in application

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