2010-09-16 108 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); 
     } 

    }