2010-09-29 9 views
0

Scenerio - J'écris une application web qui, basée sur la boîte de connexion que vous utilisez (database1 et database2), vous connecte à la base de données correspondante. J'ai mis le web.config pour contenir les deux chaînes de connexion. Sur la méthode On_Authenticate de chaque case, je vérifie pour authentifier l'utilisateur, puis envoie une chaîne basée sur la boîte de connexion à une variable publique dans une classe appelée Authentifier l'utilisateur. Cette variable publique vérifie le cookie et obtient le nom de la chaîne de connexion à partir de la variable, si le cookie est nul, il définit un nouveau cookie, expire tous les cookies existants et définit les valeurs du cookie.C# Cookie n'enregistre pas ses informations

Maintenant, une fois cela fait, chaque fois que je frappe la base de données (en utilisant LINQ2SQL), je crée un datacontext et j'envoie AuthenticatedUser.ConnectionString. Cela va vérifier le cookie et envoyer obtenir la chaîne de connexion à utiliser pour extraire les données. Herer est la classe AuthenticatedUser ...

public class AuthenticatedUser : System.Web.UI.Page 
{ 
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); 
    } 
} 

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 = ""; 
    } 
} 

}

Maintenant, cela semble fonctionner sur le premier clic de la connexion. Quand je tape dans l'information de l'utilisateur et je traverse le processus, je peux voir le cookie qui est défini/Cependant, sur le premier vrai appel de base de données où j'utilise PortalDataContext db = new PortalDataContext(AuthenticatedUser.ConnectionString); Je reçois une erreur de référence nulle. Il passe par le Get et il vérifie le cookie et retourne un cookie nul. Que pourrait-il se passer ici?

Répondre

1

Vous devez ajouter le cookie à la collection Reponse.Cookies lorsque vous le définissez à la place de la collection Request.Cookies. Seuls les cookies dans la réponse sont renvoyés au navigateur de l'utilisateur.

+0

Ce que je stroring est le nom de la chaîne de connexion pas la chaîne de connexion réelle. J'envoie ce nom dans GetConnectionStringFromName() pour obtenir la chaîne de connexion elle-même – EvanGWatkins

+0

@Evan - désolé, j'ai raté ça. Donc, tout ce que vous devez faire est de stocker le cookie dans la réponse à la place. – tvanfosson

+0

Merci, je ne peux pas croire que j'ai regardé ça. Merci! – EvanGWatkins