2011-05-05 247 views
4

在具有基於表單的身份驗證的應用程序上,我使用以下Authenticate事件處理程序的標準ASP.NET登錄控件。ASP.NET身份驗證Cookie

void Login_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    if (Security.AuthenticateUser(Login.UserName, Login.Password)) 
    { 
     e.Authenticated = true; 
     RedirectFromLoginPage(Login.UserName); 
    } 
    else 
    { 
     e.Authenticated = false; 
    } 
} 

的RedirectFromLoginPage功能是這樣的:

private void RedirectFromLoginPage(String username) 
{ 
    String returnUrl = GetReturnUrl(); 
    FormsAuthentication.SetAuthCookie(username, true, "/"); 
    Response.Redirect(returnUrl, true); 
} 

這情況下99%的罰款。但是,我有時會收到無法登錄的人的支持電話,他們將輸入憑據,重定向回首頁(當一切正常時會發生這種情況),但他們不會登錄。

指出它可能是一個cookie問題,我試圖通過將我的隱私選項設置爲「阻止所有Cookie」來重現我的環境中的問題,並且我能夠重現此問題。 SetAuthCookie函數被調用,但在下一頁加載HttpContext.Current.User.Identity.IsAuthenticated返回false。

在我的web.config中,身份驗證設置,像這樣:

<authentication mode="Forms"> 
    <forms loginUrl="..." timeout="180" cookieless="AutoDetect"/> 
</authentication> 

閱讀有關自動檢測和SetAuthCookie MSDN上的文檔,我得到了:

自動檢測指定餅乾 如果設備配置文件支持 Cookie,則使用此設置;否則,cookies不是 已使用。對於已知支持cookie的 的桌面瀏覽器,將啓用探測 機制嘗試使用 cookie。如果設備 不支持cookie,則不會使用探測機制。

FormsAuthentication.SetAuthCookie: 創建用於 提供的用戶名認證憑證,並使用Cookie的身份驗證其添加到 的 響應的Cookies集合,使用附送的餅乾 路徑,或使用URL,如果你是 。

我會認爲,在我的情況下,無cookie身份驗證會被使用,但它不是(我沒有看到在重定向後的QueryString中的任何東西)。

如果我設置在RedirectFromLoginPage功能的斷點和測試一些值,我得到:

bool cookieSupport = Request.Browser.Cookies; //"true" 
bool redirectWithCookies = Request.Browser.SupportsRedirectWithCookie; //"true" 
HttpCookieMode currentMode = FormsAuthentication.CookieMode; //"AutoDetect" 

我不知道如果Request.Browser.Cookies意味着是真還是假這裏。瀏覽器不支持cookies,但它們全部被屏蔽...

無論如何,我已經在發生問題的機器上遙控了幾分鐘。隱私設置設置爲中等,因此它應該能夠接受cookie。這是一個標準的Win7/IE8設置。我試圖將該網站添加到用戶的信任區域,通過https登錄,但它不起作用。其他問題的設置是相似的(沒有真正突出的機器和用戶告訴我,他們在其他網站沒有問題)

那麼我在這裏做錯了什麼?

回答

1

您是否在web.config文件中爲表單身份驗證Cookie指定了域?它是否與網站的域名相匹配?

我相信IE中的中等安全設置阻止第三方cookie,所以問題可能是IE認爲您的身份驗證Cookie是第三方Cookie。

+0

我不這樣做,但不會通過將該網站添加到可信區域來避免這個問題? – 2011-05-05 19:31:19

+0

假設默認隱私級別沒有改變,是的,應該這樣做。只需確保在測試更改之前將站點添加到「受信任」區域後關閉所有IE會話。 – 2011-05-05 19:36:00

+0

另一個想法是,嘗試清空瀏覽器緩存。我似乎記得一個完整的緩存導致過去的表單身份驗證問題(只在IE中)。 – 2011-05-05 19:37:49

1

我也遇到類似的問題。但它只適用於Internet Explorer 8.經過一番研究,我發現默認情況下IE8運行在無風險模式下。所以,我改變了web.config中的這一行: <forms loginUrl="..." timeout="180" cookieless="AutoDetect"/><forms loginUrl="..." timeout="180" cookieless="UseUri"/>,它工作正常。