2009-11-05 30 views
4

我在一個簡單的莊園中使用ASP.Net登錄控件,但是我發現ASPXAUTH cookie的終止日期爲{01/01/0001 00:00:00}。這應該不是爲了防止黑客操縱?我自己並不發佈cookie,而是讓.NET創建它。Asp.Net - FormsAuthentication ASPXAUTH Cookie ExpiryDate = 01/01/0001 00:00:00

我在我的網絡應用程序上運行掃描,它能夠存儲ASPX cookie信息,轉到註銷頁面,然後轉到無需登錄的頁面我假設使用存儲的cookie信息。

手動使用應用程序我無法做到這一點,它總是在嘗試訪問頁面時將我發送到登錄頁面。

登出頁面調用FormsAuthentication.SignOut()

編輯:原來這是一個已知的問題!誰知道http://support.microsoft.com/kb/900111

+1

你是如何檢查cookie的失效日期的? – Phaedrus 2009-11-05 18:01:04

+0

閱讀請求和響應Cookie集合 – Jon 2009-11-06 12:15:36

回答

1

如果您保存了cookie的值,註銷並重新將該cookie呈現給服務器,它將只會自動登錄您,就好像您從未註銷過一樣。

這是因爲您還可以告訴.NET框架設置持久性身份驗證cookie(默認情況下,您可以通過Login控件的DisplayRememberMe屬性公開的「記住我?」複選框向用戶展示此選項)所以到期日將成爲未來的價值。

當用戶回到網站並且他們的瀏覽器發送cookie時,它們會自動登錄 - 所以您看到的行爲是設計。

如果您需要更安全,最簡單的方法是在登錄控件的OnLoggedIn事件中添加一個方法,並設置一個會話值(即,Session.Add("HasLoggedIn", true)),您可以再檢查其他地方,如果這不是真的,重定向到登錄頁面:

if (null == Session["HasLoggedIn"] || !(bool)Session["HasLoggedIn"]) { 
    FormsAuthentication.RedirectToLoginPage(); 
} 

編輯迴應評論:

這就是爲什麼你看到01/01/0001 00:00:00的有效期限 - 在會話結束時將被刪除 - 或者當您關閉瀏覽器時 - 但您看到的內容沒有任何根本性錯誤 - 僅僅因爲您不設置永久性Cookie並不意味着如果您將舊Cookie的副本發送回服務器,它不會將您登錄到服務器。

正如我所說的,如果您想確保用戶每次都必須登錄(或「解決」此問題),請添加您在用戶實際登錄時設置的會話變量,並拒絕所有請求它。


爲第二評論

此外編輯從Explained: Forms Authentication

認證之後接收到後續請求每次,FormsAuthenticationModule類從認證的cookie中檢索的認證券進行解密它會計算散列值,並比較MAC值以確保cookie未被篡改。最後,驗證表格認證票據內包含的到期時間。

注意 ASP.NET不依賴cookie的截止日期,因爲這個日期很容易被僞造。

所以cookie必須在票證過期之前發送回服務器。

+0

DisplayRememberMe爲false,因此不存在持久性Cookie – Jon 2009-11-06 12:14:59

+0

但是,SignOut應該刪除Cookie,以便您不能重新登錄?這不是一個帶有FormsAuthentication的巨大安全漏洞 - 即只是複製一個cookie值,即使你已經註銷,你可以發送cookie值回來,它會登錄你? – Jon 2009-11-06 16:22:28

+0

感謝您的信息,但如果你看到我的編輯,這也回答了我的問題的一部分,即如果你複製一次認證的cookie值,然後即使SignOut被調用,你仍然可以使用受保護的頁面,FormsAuthentication可以被繞過 – Jon 2009-11-07 15:05:16

2

您無法讀取Cookie過期日期和時間。瀏覽器使用cookie過期日期來確定是否將cookie發送到服務器。如果cookie已過期,瀏覽器不會將該cookie發送到具有頁面請求的服務器,則該cookie將被刪除。

如果cookie尚未過期,則將cookie發送給服務器sans過期信息,因爲瀏覽器利用此信息來確定cookie是否應該發送。您可以從請求中讀取到期日期,但正如您發現它返回日期時間值爲零。

嘗試檢查LoggedIn事件中Response.Cookies集合的到期日期。這應該產生cookie的正確失效日期。

protected void Login1_LoggedIn(object sender, System.EventArgs e) 
{ 
    HttpCookie cookie = Response.Cookies(".ASPXAUTH"); 
    DateTime expires = cookie.Expires; 
} 

更多信息請參見Basics of Cookies in ASP.NET

+0

好吧我認爲我明白,但是閱讀Response.Cookie到期日期在LoggedIn事件中也是零 – Jon 2009-11-06 12:13:53

+0

Zhaph - Ben Duguid是正確的,有效期限是01/01/0001 00 :00:00是因爲您正在發行非永久性Cookie。嘗試將Login控件的'RememberMeSet'屬性設置爲true,然後檢查LoggedIn事件中的過期時間。請記住,正如Zhaph所述,在用戶的瀏覽器上設置持久身份驗證Cookie存在安全風險。 – Phaedrus 2009-11-06 15:50:07