2008-10-14 8 views
3

J'ai une applet Java qui s'exécute dans une page ASPX authentifiée par des formulaires. Dans la version .NET 1.1 de mon site, l'applet a accès au cookie de session et est capable de récupérer un fichier du serveur, mais dans la version .NET 2.0, il ne parvient pas à s'authentifier.Partage de cookies de session ASP.NET avec une applet Java

J'ai vu quelques messages de forum ailleurs qui indiquent que 2.0 place des biscuits à HttpOnly par défaut, mais les solutions données n'ont pas fonctionné pour moi jusqu'ici. J'ai également lu quelque part que 2.0 peut être discriminant basé sur user-agent.

Quelqu'un at-il une expérience ou un aperçu de cela?

Répondre

5

Cette question est ancienne, mais j'ai pensé qu'il était utile d'avoir la bonne réponse ici.

Filip confond le serveur Java avec Java côté client. Il a raison de dire que vous ne pouvez pas partager des sessions entre deux plates-formes côté serveur, telles que Java (J2EE) et ASP.Net sans utiliser une approche personnalisée. Cependant, les applets sont côté client et devraient donc pouvoir accéder aux informations de session de la page hôte. Le problème est que ASP.Net 2.0 a ajouté l'indicateur HttpOnly sur les cookies de session. Cet indicateur empêche JavaScript et les applets Java d'accéder à ces cookies.

La solution de contournement consiste à désactiver le drapeau HttpOnly sur les cookies de session. Alors que vous pourriez être en mesure de le faire dans la configuration dans les versions les plus récentes de ASP.Net, dans les versions précédentes, la solution est d'ajouter le code suivant à votre fichier Global.asax:

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    /** 
    * @note Remove the HttpOnly attribute from session cookies, otherwise the 
    *  Java applet won't have access to the session. This solution taken 
    *  from 
    *  http://blogs.msdn.com/jorman/archive/2006/03/05/session-loss-after-migrating-to-asp-net-2-0.aspx 
    * 
    *  For more information on the HttpOnly attribute see: 
    * 
    *  http://msdn.microsoft.com/netframework/programming/breakingchanges/runtime/aspnet.aspx 
    *  http://msdn2.microsoft.com/en-us/library/system.web.httpcookie.httponly.aspx 
    */ 
    if (Response.Cookies.Count > 0) 
    { 
     foreach (string lName in Response.Cookies.AllKeys) 
     { 
      if (lName == FormsAuthentication.FormsCookieName || 
       lName.ToLower() == "asp.net_sessionid") 
      { 
       Response.Cookies[lName].HttpOnly = false; 
      } 
     } 
    } 
} 

Notez que même avec ce correctif , toutes les combinaisons navigateur/OS/Java ne peuvent pas accéder aux cookies. Je suis actuellement à la recherche d'un problème avec les cookies de session ne sont pas accessibles sur Firefox 4.0.1 avec Java 1.6.0_13 sur Windows XP. La solution de contournement consiste à utiliser l'approche suggérée par Dr. Dad, où l'ID de session est passé à l'applet en tant que paramètre, puis est soit incorporé dans l'URL de la requête (les sessions URL doivent être activées dans le serveur). configuration latérale) ou envoyé en tant que cookie défini manuellement.

0

La réponse de Filip n'est pas entièrement correcte. J'ai exécuté un programme pour renifler les en-têtes HTTP sur mon poste de travail, et l'applet Java présente en fait le ticket d'authentification ASP.NET dans certaines circonstances - pas assez fiable pour mes besoins.

Finalement, j'ai trouvé une solution à cela, mais cela n'a pas entièrement résolu mon problème. Vous pouvez ajouter une entrée au fichier web.config dans .NET 2.0: <httpCookies httpOnlyCookies="false" />; mais cela n'a pas fonctionné pour tous mes utilisateurs.

La solution à long terme s'est avérée être la modification de l'applet Java afin qu'il n'a pas besoin de récupérer quoi que ce soit du serveur Web.

1

Filip est à la fois correct et incorrect, au moins par rapport à Java et ASP.NET. Une applet peut accéder à la session ASP.NET en trichant. Dans mon cas, nous avons ajouté l'identifiant de session en tant que paramètre à l'applet, que l'applet ajoute ensuite en tant que cookie dans ses requêtes. Ça semble fonctionner. (Nous avons crypté l'identifiant de session pour déjouer ces méchants hackers!)

0

Je suis conscient que ce peut être une réponse très tardive, mais je peux vous donner une solution plus simple: - généralement, pas toujours, les applets font un usage intensif du html et du javascript pour leurs interfaces et interactions. - Javascript est affiché dans le navigateur. - Les appels Ajax sont effectués par le navigateur. - Les appels Ajax sont asynchrones et peuvent être facilement intégrés à une logique d'applets.

On peut trouver une solution élégante intégrant des appels Ajax à la logique d'une applet, déléguant au navigateur la sécurité.