2010-10-07 39 views
1

我有一個代碼庫的Web應用程序連接到2個數據庫。根據用戶使用哪個登錄控件進行登錄,將不同的數據庫連接到代碼。我正在做一個cookie的所有這一切。該cookie位於名爲AuthenticatedUser的公共類中。這個類看起來是這樣的:強制.net登錄控制,使用戶註銷,如果cookie爲空

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.Response.Cookies.Add(cookie); 
     } 
    } 

    private static string GetConnectionStringFromName(HttpCookie myCookie) 
{ 
    try 
    { 
     string connectionStringName = myCookie.Value; 
     return ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString; 
    } 
    catch 
    { 
     FormsAuthentication.SignOut(); 
    } 
    finally 
    { 
     HttpContext.Current.Response.Redirect("/default.aspx"); 
    } 
    return ""; 

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

這似乎是工作我的機器上,但是當我試圖部署它,這是使用網站上的「記住我」選項的用戶是越來越空引用錯誤,因爲他們沒有使用登錄控件來獲取cookie。

解決此問題的最佳方法是什麼?我想如果一個用戶登錄,但AuthenticatedUser類無法獲得一個Connectionstring註銷用戶強制他們再次使用登錄控制。我該怎麼辦?

回答

1

嘗試使用:

try 
{ 
     FormsAuthentication.SignOut(); 
} 
finally 
{ 
     Response.Redirect("~/Home.aspx"); 
} 

這種方式是最好的,例如如果在某些時候你會決定一事─cookie認證,但基於URL - 在FormsAuthentication會優雅地管理它。

+0

我已經更新了代碼,那是你在想什麼?我試圖在我的開發機器上測試它,但我很難再次解決這個問題。這種結構是否正確? – EvanGWatkins 2010-10-07 13:35:45

+0

@EvanGWatkins - 實際上FormsAuthentication.SignOut()會清除身份驗證cookie(如果通過ASP.Net標準方式驗證,或者至少通過FormsAuthentication.SetAuthCookie驗證)。所以你不需要手動刪除它。 – Dewfy 2010-10-07 14:23:39

+0

你能解釋一下嗎?成員登錄是標準登錄,所以我需要做的就是檢查cookie(在嘗試中),如果它很棒,繼續移動,如果它爲空,則註銷用戶並將其重定向到登錄名。 – EvanGWatkins 2010-10-07 14:26:03