Thursday, December 13, 2012

ASP.NET Forms Authentication Safari/Chrome sur IOS

Contexte

Je développe actuellement une Webapp HTML5 communiquant avec des services WCF. Pour les sécuriser, j'ai implémenté l'authentification ASP.NET par formulaire.
Certaines fois, sur iOS 6,  l'appel au webservice sécurisé était refusé. Sur ipad, je l'ai généralement rencontré en Webview, quand on ajoute la webapp sur le Homescreen.

Lors de la connexion de l'utilisateur à la Web App, on réalise le code ci-dessous :
  1. FormsAuthentication.SetAuthCookie(userName, true /*createPersistentCookie*/);
La configuration de Web.config est la suivante :
  1. <authentication mode="Forms" >
  2. <forms loginUrl="../Login.html" timeout="2880" />
  3. </authentication>

Solution

En analysant la réponse du serveur je me suis aperçu que finalement je n'étais pas authentifié. Alors que le web service d'authentification l'avait bien confirmé.
Certaines fois le cookie d'authentification n'est pas bien obtenu par le navigateur, notamment sur Safari et Chrome. Après beaucoup de recherches, j'ai finalement trouvé une solution.

Plusieurs étapes sont à réaliser :
  1. Dans le Web.config, il faut ajouter la clé suivante, qui permet de forcer l'utilisation des cookies par le navigateur. Par défaut c'est UseDefault :
    1. <authentication mode="Forms" >
    2.        <forms loginUrl="../Login.html" timeout="2880" cookieless="UseCookies" />
    3. </authentication>
  2. Ensuite il peut aussi être utile de rajouter une MachineKey dans le Web.Config, pour éviter un problème dans le cryptage/décryptage du cookie d'authentification.
    1. <system.web> 
    2.       <machineKey validationKey='myKey' decryptionKey='myDecryptKey' validation='SHA1'/>
    3. </system.web>
Pour générer une machineKey, vous pouvez aller directement sur ce site : Générateur de machineKey