2012-03-21 75 views
3

我剛剛推出了我的第一個MVC3應用程序,除Cookies授權外,一切正常。當用戶訪問我的網站並登錄時,我使用關於該用戶的數據設置了一個.ASPAUTH cookie。它運行良好,直到一段時間過去。然後,即使該Cookie位於瀏覽器中,我也必須再次登錄,並且可以看到過期設置爲一年後。它在我的本地主機上正常工作。 在我看來,它不是將我的信息設置爲cookie,而是以某種方式在會話中,但即使我在一小時內重新啓動計算機,我仍然登錄。但如果我在1小時內未訪問網站,我退出了。MVC3不接受cookie

感謝您的任何幫助。

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
       1, 
       requestedUser.Name, 
       DateTime.Now, 
       DateTime.Now.AddYears(1), 
       true, 
       string.Format("{0};{1};{2}", requestedUser.IDUser.ToString(), requestedUser.IsAdmin.ToString(), profilePicture)); 

      string encryptedTicket = FormsAuthentication.Encrypt(ticket); 
      HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
      cookie.Expires = keepLogged == "keepLogged" ? DateTime.Now.AddYears(1) : DateTime.Now.AddHours(1); 

      this.Response.Cookies.Add(cookie); 
      return RedirectToAction("Index", "Posts"); 
+0

應用程序池重新啓動可能是由於空閒超時導致會話cookie無效 - 請參閱http://stackoverflow.com/questions/4277944/ is-it-it-to-recycle-iis-application-pools-without-losing-user-sessions – tawman 2012-03-21 13:28:01

+0

你可以在你設置表單身份驗證的地方顯示代碼嗎? – 2012-03-21 13:34:53

+0

@tawman感謝您的幫助,但我可以在客戶端的瀏覽器上看到cookie,爲什麼應用程序不能?對不起,跛腳的問題,但我真的必須解決這個問題,不明白什麼是錯的。 – Petr 2012-03-21 13:40:12

回答

6

你需要設置在web.config中東西的machineKey這樣

<machineKey validationKey="4B79DF965DC586D2B267BDECB4580D40EE6811EE171AC65D929BECD8865C09ED8681B92F2177FE9F72B8E822B26914C79C1FF590CCEE65469CBC6FACD7D9F203" decryptionKey="CF39BCCD33BC38D17A704DFEB85AD9C5F265669FCD6AB54C" validation="SHA1" /> 

您可以使用此工具http://aspnetresources.com/tools/machineKey做到這一點,但你必須將其粘貼介紹web.config文件。

每次應用程序池recycels應用程序重新啓動,如果它沒有在web.config中設置,自動生成一個新的機器鍵。 FormsAuthentication cookie與該計算機密鑰進行散列處理,每當其發生更改時,該Cookie都將變爲無效

+0

這看起來像是我正在尋找的解決方案,我會嘗試。 – Petr 2012-03-21 13:56:23

+0

MikeSW非常感謝,它非常完美。 – Petr 2012-03-21 15:05:26