2010-09-16 115 views
1

我有一個默認的web應用程序和一個默認2的web應用程序的2個登錄控件(命名約定會在我得到它的工作後更新)。C#基於登錄信息的Cookie

我在做的是在每次登錄時設置一個cookie,從login controls authenticate方法發送連接字符串名稱。它發送一個硬編碼到名爲Authenticate Users的基類的字符串。該類執行以下操作...

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

}

我的琴絃「數據庫1」和「DATABASE2」,這取決於seding登錄他們使用的控制。當我通過代碼進行調試時,連接字符串設置了所有cookie信息,並且對於「database2」,一切都很好。但是,每次我使用與「database1」關聯的表單登錄時,它都會設置Cookie,但是當調用get時它仍然引用「database2」

這是一個問題,因爲cookie被命名爲相同的並且不覆蓋eachother或自我更新或者是否存在與我的代碼有關的問題?

編輯 - 它仍然沒有從上下文中取出餅乾的工作,但它仍然給了我「DATABASE2」當我運行「數據庫1」

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); 
    } 
} 

最後編輯它的工作原理...這裏是工作代碼,如果有人感興趣...

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

回答

1

你有一部分所需的代碼(過期的cookie)。但您還需要從上下文中刪除,請嘗試如下所示:

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); 
     } 

    }