2010-09-16 6 views
1

J'ai 2 contrôles de connexion sur une application Web, l'un sur la valeur par défaut et l'autre sur la valeur par défaut2 (la convention de dénomination sera mise à jour après le fonctionnement). Ce que je fais est de placer un cookie sur chaque connexion qui enverra un nom de chaîne de connexion de la méthode d'authentification de contrôles de connexion. Il envoie une chaîne codée en dur à une classe de base appelée Authenticate Users. La classe fait ce qui suit ...C# Cookies basés sur les informations de connexion

public class AuthenticatedUser : System.Web.UI.Page 
{ 
public static string ConnectionString 
{ 
    get 
    { 
     HttpCookie myCookie = HttpContext.Current.Request.Cookies["connectionString"]; 
     return GetConnectionStringFromName(myCookie); 
    } 
    set 
    { 
     HttpCookie oldCookie = HttpContext.Current.Request.Cookies["connectionString"]; 
     oldCookie.Expires = DateTime.Now.AddDays(-1); 
     HttpCookie cookie = new HttpCookie("connectionString"); 
     cookie.Value = value; 
     cookie.Expires = DateTime.Now.AddYears(100); 
     HttpContext.Current.Request.Cookies.Add(cookie); 
     string val = cookie.Value; 
    } 
} 

private static string GetConnectionStringFromName(HttpCookie myCookie) 
{ 
    string connectionStringName = myCookie.Value; 
    return ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString; 
} 

}

Je Seding dans les chaînes « database1 » et « database2 » selon le contrôle de connexion qu'ils utilisent. Quand je débogue par le code, la chaîne de connexion règle toutes les informations de cookie et tout fonctionne bien pour "database2" cependant chaque fois que je me connecte en utilisant le formulaire associé à "database1", il configure le cookie mais quand le get est appelé référencement "database2"

Est-ce un problème parce que les cookies sont nommés de la même manière et ne se remplacent pas mutuellement ou ne se mettent pas à jour ou y a-t-il un problème avec mon code?

modifier - il ne fonctionne toujours pas avec la suppression des cookies du contexte, il me donne toujours le « database2 » quand je lance « database1 »

public static string ConnectionString 
{ 
    get 
    { 
     HttpCookie myCookie = HttpContext.Current.Request.Cookies["connectionString"]; 
     return GetConnectionStringFromName(myCookie); 
    } 
    set 
    { 
     if (HttpContext.Current.Request.Cookies["connectionString"] != null) 
     { 
      ExpireCookies(HttpContext.Current); 
     } 
     HttpCookie cookie = HttpContext.Current.Response.Cookies["connectionString"]; 
     cookie.Value = value; 
     cookie.Expires = DateTime.Now.AddYears(100); 
     HttpContext.Current.Response.Cookies.Add(cookie); 
     string val = cookie.Value; 
    } 
} 

private static string GetConnectionStringFromName(HttpCookie myCookie) 
{ 
    string connectionStringName = myCookie.Value; 
    return ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString; 
} 

private static void ExpireCookies(HttpContext current) 
{ 
    var allCookies = current.Request.Cookies.AllKeys; 
    foreach (var cook in allCookies.Select(c => current.Response.Cookies[c]).Where(cook => cook != null)) 
    { 
     cook.Value = ""; 
     cook.Expires = DateTime.Now.AddDays(-1); 
     current.Response.Cookies.Remove(cook.Name); 
    } 
} 

Modifier final Il fonctionne ... voici le code de travail si quelqu'un est intéressé ...

public static string ConnectionString 
{ 
    get 
    { 
     HttpCookie myCookie = HttpContext.Current.Request.Cookies["connectionString"]; 
     return GetConnectionStringFromName(myCookie); 
    } 
    set 
    { 
     if (HttpContext.Current.Request.Cookies["connectionString"] != null) 
     { 
      ExpireCookies(HttpContext.Current); 
     } 
     var allCookies = HttpContext.Current.Request.Cookies.AllKeys; 
     HttpCookie cookie = new HttpCookie("connectionString"); 
     cookie.Value = value; 
     cookie.Expires = DateTime.Now.AddYears(100); 
     HttpContext.Current.Request.Cookies.Add(cookie); 
     string val = cookie.Value; 
    } 
} 

private static string GetConnectionStringFromName(HttpCookie myCookie) 
{ 
    string connectionStringName = myCookie.Value; 
    return ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString; 
} 

private static void ExpireCookies(HttpContext current) 
{ 
    var allCookies = current.Request.Cookies.AllKeys; 
    foreach (var cook in allCookies.Select(c => current.Response.Cookies[c]).Where(cook => cook != null)) 
    { 
     cook.Value = ""; 
     cook.Expires = DateTime.Now.AddDays(-1); 
     current.Request.Cookies.Remove(cook.Name); 
     cook.Name = ""; 
    } 
} 

Répondre

1

vous avez une partie du code nécessaire (expirant le cookie). mais vous devez également supprimer du contexte, essayez quelque chose comme ce qui suit:

private static void ExpireCookies(HttpContext current) 
    { 
     var allCookies = current.Request.Cookies.AllKeys; 

     foreach (var cook in allCookies.Select(c => current.Response.Cookies[c]).Where(cook => cook != null)) 
     { 
      cook.Value = ""; 
      cook.Expires = DateTime.Now.AddDays(-1); 
      current.Response.Cookies.Remove(cook.Name); 
     } 

    } 
Questions connexes