在具有基於表單的身份驗證的應用程序上,我使用以下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登錄,但它不起作用。其他問題的設置是相似的(沒有真正突出的機器和用戶告訴我,他們在其他網站沒有問題)
那麼我在這裏做錯了什麼?
我不這樣做,但不會通過將該網站添加到可信區域來避免這個問題? – 2011-05-05 19:31:19
假設默認隱私級別沒有改變,是的,應該這樣做。只需確保在測試更改之前將站點添加到「受信任」區域後關閉所有IE會話。 – 2011-05-05 19:36:00
另一個想法是,嘗試清空瀏覽器緩存。我似乎記得一個完整的緩存導致過去的表單身份驗證問題(只在IE中)。 – 2011-05-05 19:37:49