2010-10-28 4 views
2

J'ai une solution d'authentification unique qui fonctionne très bien dans notre environnement de test. Il utilise des cookies inter-sous-domaine pour partager le ticket d'authentification entre deux applications Web. La connexion est effectuée uniquement sur l'une des applications et sur le second site, l'utilisateur est authentifié par le cookie créé par le premier site. Le problème est que lorsque je le déploie dans l'environnement de production, l'authentification unique ne fonctionne plus. Je cherche des idées sur pourquoi cela pourrait être. Plus de détails ci-dessous:Cookies d'authentification unique ASP.NET inter-domaines

1) Les deux applications sont mises en œuvre en utilisant ASP.NET MVC2

2) Dans notre environnement de test les deux sites sont assis sur un seul serveur, avec des sites différents en-têtes IIS et hôte utilisé pour servir les 2 applications web. En production, les sites sont sur des serveurs différents géographiquement séparés. Ils utilisent les mêmes sous-domaines cependant.

3) Les deux sites ont une configuration SSL et sont accessibles via https; Ceci est fait à la fois en test et en production en utilisant le même certificat wild-card autosigné.

4) Les utilisateurs se connectent au site1, puis l'application récupère automatiquement les données du site2 en utilisant AJAX et JSONP.

5) si les sites sont site1.example.com et site2.example.com, les éléments suivants sont les parties importantes du web.config partagées entre site1 et site2:

... 
<authentication mode="Forms"> 
    <forms name=".myapp" domain=".example.com" slidingExpiration="true" loginUrl="~/Account/LogOn" timeout="30"/> 
</authentication> 
... 
<machineKey validationKey="KEY1..." decryptionKey="KEY2..." 
    validation="SHA1" decryption="AES" /> 
... 

NOTE: Une chose Je m'interroge sur ce qui précède: le ticket d'authentification est-il chiffré \ hashé de telle façon qu'il ne peut être décrypté que sur le même serveur? Cela expliquerait mon problème. mais si c'est le cas, comment puis-je m'assurer que le serveur pour site1 et site2 puisse déchiffrer mon cookie d'authentification? KEY1 et KEY2 sont définitivement les mêmes sur les deux sites \ serveurs.

6) Sur Site1 les rôles que l'utilisateur est en sont également insérés dans le cookie en utilisant les éléments suivants:

public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl) 
    { 
     if (!ValidateLogOn(userName, password)) 
     { 
      ViewData["rememberMe"] = rememberMe; 
      return View(new SiteViewModel(this)); 
     } 

     FormsAuth.SignIn(userName, rememberMe); 

     // Add roles to cookie 
     string[] roles = Roles.GetRolesForUser(userName); 
     HttpCookie cookie = FormsAuthentication.GetAuthCookie(User.Identity.Name, rememberMe); 
     FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 
     // Store roles inside the Forms cookie. 
     FormsAuthenticationTicket newticket = new FormsAuthenticationTicket(ticket.Version, userName, 
      ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, String.Join("|", roles), ticket.CookiePath); 
     cookie.Value = FormsAuthentication.Encrypt(newticket); 
     cookie.HttpOnly = false; 
     Response.Cookies.Remove(cookie.Name); 
     Response.AppendCookie(cookie); 

     if (!String.IsNullOrEmpty(returnUrl)) 
     { 
      return Redirect(returnUrl); 
     } 
     return RedirectToAction("Index", "Home"); 
    } 

7) Les rôles sont restaurés sur Site2 en utilisant les éléments suivants:

 protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
     if (Context.Request.IsAuthenticated) 
     { 
      FormsIdentity ident = (FormsIdentity)Context.User.Identity; 
      string[] arrRoles = ident.Ticket.UserData.Split(new[] { '|' }); 
      Context.User = new System.Security.Principal.GenericPrincipal(ident, arrRoles); 
     } 
    } 

EDIT:

8) Ceci est une impression des assemblages référencés par les applications sur les deux serveurs:

 mscorlib: 2.0.0.0 
    System: 2.0.0.0 
     System.Configuration: 2.0.0.0 
      System.Xml: 2.0.0.0 
    System.ComponentModel.DataAnnotations: 3.5.0.0 
     System.Core: 3.5.0.0 
    System.Data: 2.0.0.0 
     System.EnterpriseServices: 2.0.0.0 
      System.Transactions: 2.0.0.0 
    System.Data.Entity: 3.5.0.0 
     System.Runtime.Serialization: 3.0.0.0 
      SMDiagnostics: 3.0.0.0 
    System.Web: 2.0.0.0 
     System.Drawing: 2.0.0.0 
     System.Web.RegularExpressions: 2.0.0.0 
     System.Web.Services: 2.0.0.0 
    System.Web.Abstractions: 3.5.0.0 
    System.Web.Extensions: 3.5.0.0 
     System.Data.Linq: 3.5.0.0 
      System.Xml.Linq: 3.5.0.0 
     System.ServiceModel: 3.0.0.0 
      System.IdentityModel: 3.0.0.0 
     System.ServiceModel.Web: 3.5.0.0 
    System.Web.Mvc: 1.0.0.0 
     System.Web.Routing: 3.5.0.0 
    xVal: 1.0.0.0 

Répondre

4

Oui. Le chiffrement est spécifique au serveur. Ou être plus précis repose sur la clé de la machine étant la même chose.

  1. Essayez d'utiliser la même clé de la machine dans les deux configs Web.
  2. Si cette dose aide. supprimer le cryptage et essayer si les travaux puis

Si elle ne fonctionne pas après avoir retiré la sécurité/cryptage entièrement il n'a rien todo avec cryptage incompatible. Laissez nous savoir.

MISE À JOUR Ceci est extrait de notre fichier web.config. Après avoir supprimé les spécificités du site bien sûr. Essayez de préciser tout explicitement, en particulier le chemin :

<forms name=".ASPNET" protection="All" loginUrl="~/Account/LogOn" timeout="2880" 
     path="/" domain=".example.com"/> 
+1

Comment puis-je utiliser la même clé de la machine? Dans mon exemple, web.config au-dessus de validationKey et decryptionKey sont explicitement définis et identiques sur les deux serveurs. Y a-t-il une autre clé que je dois mettre quelque part ou sont-elles? – mutex

+0

Non c'est le seul, sry je ne regardais pas assez. Avez-vous essayé de supprimer tout le cryptage pour le processus d'authentification? – ntziolis

+0

Oui, supprimé tout le cryptage et les choses fonctionnent! Très confus pourquoi cela ne fonctionne pas avec le cryptage lorsque les clés sont les mêmes. Est-ce qu'il ajoute une sorte d'information spécifique au serveur dans le mélange? – mutex