Depuis pas mal de temps, les utilisateurs du site internet MSLive.fr me rapportaient que le cookie d'authentification ne tenait pas plus de 24h. Or, les administrateurs du site m'avaient demandé expressément de faire en sorte que l'utilisateur n'ait pas à se ré-authentifier régulièrement sur le site (c'est un choix!). J'ai donc choisi de mettre un cookie d'authentification de plusieurs mois.
Voyons rapidement comment le cookie est créé :
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(login_form.UserName, login_form.RememberMeSet, 1439200);
string encryptedTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
if (ticket.IsPersistent)
cookie.Expires = DateTime.Now.AddMonths(3);
HttpContext.Current.Response.Cookies.Add(cookie);
Jusque là rien de bien compliqué, nous créeons un cookie d'authentification ASP.NET à l'aide de la classe FormsAuthenticationTicket. Nous chiffrons alors les informations du ticket que nous stockons dans un cookie expirant 3 mois plus tard, si l'utilisateur souhaite que le site se souvienne de lui.
Seul problème, impossible de faire fonctionner la chose, pourtant tout est là pour. Après de nombreuses et longues recherches, il m'a été rapporté un problème similaire provenant de load balancing au niveau du serveur web IIS.
Je me suis alors tourné vers mon hébergeur qui m'a confirmé que IIS était configuré en NLB (Network Load Balancing), i.e. que le site est hébergé par une ferme de serveurs web, regroupés au sein d'un cluster. En bref, plusieurs serveurs IIS hébergent le site Internet, et sont tous à même de délivrer un cookie d'authentification et donc de chiffrer un ticket d'authentification.
Il devient alors facile de comprendre que seul le serveur qui aura chiffré le ticket d'authentification sera capable de réaliser l'opération inverse afin d'authentifier l'utilisateur.
Pour éviter ce problème du au load balancing IIS, il suffit tout simplement de redéfinir le paramètre machineKey du machine.config et ce dans la section <system.web> du fichier Web.config de votre site Internet :
<machineKey validationKey=“clef de validation” decryptionKey=“clef de description” validation=“paramètre de validation” />
Cette section sera alors utilisée par tous les serveurs IIS du cluster pour chiffrer et déchiffrer le ticket d'authentification.
Voyons un petit détail des différentes composantes de cette section de configuration :
-
validationKey : spécifie la clé qui doit être utilisés pour valider les données chiffrées du ticket d'authentification.
-
decryptionKey : spécifie la clé qui doit être utilisée pour chiffrer et déchiffrer les données du ticket d'authentification.
-
validation : spécifie l'algorithme de chiffrement utilisé : SHA1, MD5, 3DES.
Ces données peuvent être générées par le code. Je vous invite à regarder cette page pour voir comment générer cette ligne du fichier de configuration!
Vous n'avez plus qu'à placer la directive dans votre fichier de configuration, et là, vos utilisateurs n'auront plus besoin de s'authentifier à chaque passage sur le site !