OpenID et ASP.NET MVC

J’avais déjà entendu parler de RPX comme étant un service qui rend l’intégration d’OpenID très facile. Mais c’est en l’utilisant que je me suis rendu compte de sa simplicité. RPX se propose de jouer l’intermédiaire entre votre application et les différents fournisseurs d’identité dont OpenID.

Voici un diagramme issu du site de RPX qui résume très bien l’interaction entre les acteurs :

séquence d'appels entre les acteurs
séquence d'appels entre les acteurs

Voici son intégration dans une application ASP.NET MVC :

Le premier écran est une page d’identification, celle-ci est appelée quand un visiteur non-identifié accède au site (On pourra utiliser un attribut pour sécuriser son controller comme expliqué ici)

Sign In

page d'identification
page d'identification

Dans l’en-tête il suffit d’ajouter une référence à un script, on ajoute une URL de retour en paramètre qui sera ajouté à la page de retour appelée par RPX quand l’identification “tierce” sera finie (étape 5):

(ici on génère aussi une partie de l’adresse par javascript car cette application déployée sur Azure est derrière des serveurs frontaux, on ne repose donc pas sur des variables serveur comme le SERVER_PORT qui renvoie des informations interne à l’infrastructure Azure)

choix fournisseur
choix fournisseur

identification chez Google
identification chez Google

Lorsque l’utilisateur est authentifié, notre application est appelée via l’URL spécifiée avec un token passé en paramètre : http://127.0.0.1/OpenID/LoginFromOpenID?ReturnUrl=/Reporting/&token=68368d24709811020394bd459b3a77cb5c48d893

Ce token nous sert à récupérer l’identité de l’utilisateur via le helper trouvé aussi sur le site de RPX, Voici le code du controller :

public ActionResult LoginFromOpenID(){ string token = Request.QueryString[“token”]; string returnUrl = Request.QueryString[“returnUrl”]; //user cancel the auth. on the provider website if(string.IsNullOrEmpty(token)) return RedirectToAction(“Index”, “Home”); //get the user info var authenticationDetails = rpxService.GetAuthenticationDetails(token, true); //check the user locally var user = Provider.ValidateUser(authenticationDetails.Email, authenticationDetails.Email); if (user) { SignIn(authenticationDetails.Email, true); if (!String.IsNullOrEmpty(returnUrl)) { return Redirect(returnUrl); } return RedirectToAction(“Index”, “Home”); } else { return RedirectToAction(“Login”, new { message = “Vous n’êtes pas autorisés à accèder à cette application” }); } }

On récupère le token puis les informations de l’utilisateur. Nous vérifions auprès de notre base locale d’utilisateurs que celui-ci est autorisé. Le provider de “membership” ASP.NET utilisé est celui fourni par Microsoft dans le SDK Azure et qui permet de stocker les informations de profile, session dans une table Azure Storage.

Bien sûr on se repose beaucoup sur un fournisseur tiers mais la simplicité de RPX amène un bon compromis.

billet publié dans les rubriques coding le