2014-10-08 134 views
11

我有這樣的代碼,當用戶被授權可以在運行:cookie過期或會話超時太快

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
       1, 
       email, 
       DateTime.Now, 
       DateTime.Now.AddMinutes(120), 
       true, 
       userData); 

     string encTicket = FormsAuthentication.Encrypt(authTicket); 
     HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 
     faCookie.Expires = authTicket.Expiration; 
     Response.Cookies.Add(faCookie); 

我然後重定向到一個控制器/動作具有Authrize屬性:

[Authorize] 
    public class ProductsController : Controller 
    { 

我已在web.config中如下:

<authentication mode="Forms"> 
     <forms loginUrl="~/Home/Unauthorized" timeout="2880" /> 
    </authentication> 
    <sessionState timeout="120"></sessionState> 

但是用戶抱怨會話超時或再在幾分鐘不活動之後指導家庭/未經授權。

什麼可能導致這種情況,我應該檢查什麼?

+0

我不明白爲什麼人們獲取與窗體身份驗證Cookie超時和服務器會話timeout..they困惑是2個不同的thinngs ...伴侶你說你的服務器 – Shaz 2014-10-13 10:57:36

+0

到期用戶時間120分鐘,並在另一方面告訴瀏覽器cookie持有2280的身份驗證票證...顯然,票據在120後過期並且用戶超時...而用戶仍然持有以前的身份驗證票證。 – Shaz 2014-10-13 10:58:42

+0

您是否明確定義了您的網絡中的MachineKey?配置? – Tommy 2014-10-13 16:46:38

回答

16

在我進入可能的解決方案之前,有一些想法可以解釋爲什麼您的登錄過期。首先,FormsAuthentication cookie和SessionState完全是兩個不同的東西。你可以有一個或另一個,或者兩者兼得,或者都不兼容。結果,這兩個項目的超時也沒有關係。

FormsAuthentication cookie是一個加密的cookie,它包含一些基本信息,如用戶名和過期值。 .NET應用程序在用戶進行身份驗證後使用此cookie來了解用戶是否獲得了某些資源的授權。

什麼控制FormsAuthentication cookie的加密和解密是MachineKey IIS上該Web應用程序。 MachineKey是一組用於加密和解密cookie的密鑰。默認情況下,IIS上的Web應用程序被設置爲AutoGenerate機器密鑰。這意味着當應用程序啓動時,會生成隨機機器密鑰。如果應用程序回收,您會得到一個新的機器密鑰。此外,如果您在共享提供程序上託管,則Web主機通常會使您的應用程序負載平衡,即由多臺服務器託管。每臺服務器都會自動生成機器密鑰。

如果您的Web應用程序處於負載平衡方案中,則Web場中的每臺計算機都無法解密其他加密的Cookie。這將會顯示「正在註銷」。其中的例子是登錄到Web服務器A上,然後後續請求轉到Web服務器B.Web服務器B不與Web服務器A共享計算機密鑰,並且無法解密該Cookie,從而將用戶發送回登錄頁面。

的解決方案是定義在web.config中的machineKey部分,因此IIS的每個實例都將使用相同的密鑰,以及如果應用程序池回收,你仍然有相同的計算機密鑰。

這裏將是一個example machine key,你可以在你的web.config放置

<system.web> 
    <machineKey validationKey="EBC1EF196CAC273717C9C96D69D8EF314793FCE2DBB98B261D0C7677C8C7760A3483DDE3B631BC42F7B98B4B13EFB17B97A122056862A92B4E7581F15F4B3551" 
    decryptionKey="5740E6E6A968C76C82BB465275E8C6C9CE08E698CE59A60B0BEB2AA2DA1B9AB3" 
    validation="SHA1" decryption="AES" /> 
</system.web> 

其他的想法是,你在你的web.config(2880),哪些過期你實際上是設置屆滿時( 120)不匹配。你可能希望他們都匹配。

+1

很好的解釋 – 2015-11-18 06:49:10

0

如果您在負載平衡器後面運行,你會想,以確保Web場使用由湯米的回答指出了一個一致的關鍵。

其他要檢查的事情是IIS元數據庫爲每個服務器設置是相同的。他們需要有相同的路徑和ID。

你也想看看暫停會議(你的網站。配置看起來像proc),這是易受網絡中斷和隨機應用程序回收。

基本上是這個鏈接的摘要。 http://msdn.microsoft.com/en-us/library/vstudio/ms178586(v=vs.100).aspx

如果您可以發佈更多配置(如果可能)並提供有關您的環境設置的更多詳細信息,則可以更輕鬆地將您指向更集中的方向。

0

試試這個:

的web.config代碼:

<system.web> 
     <httpRuntime maxRequestLength="40000000" useFullyQualifiedRedirectUrl="true" executionTimeout="600000" /> 
     <authentication mode="Forms"> 
       <forms loginUrl="~/Home/Unauthorized" timeout="2880" cookieless="UseCookies" /> 
      </authentication>  
    </system.web> 

這將幫助你。