2013-06-19 116 views
0

我們遇到了一個很大的問題。 我們使用比利時eID(電子身份證,這是一張智能卡)。返回的Claim由我們的表單身份驗證使用。10分鐘後會話超時

一切工作正常,但10分鐘後(活動或不活動,無所謂),它會自動註銷。

這裏代碼片段,我們創建會話:

private void CreateSession(ClaimsPrincipal transformedPrincipal) 
{ 
    SessionSecurityToken sessionSecurityToken = new SessionSecurityToken(transformedPrincipal, TimeSpan.FromHours(1)); 
    FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionSecurityToken); 
} 

的Web.config,我們設置會話超時:

<sessionState cookieless="false" timeout="60" /> 

IIS服務器,我們將應用程序池空閒超時設置爲8小時。
我們還將循環的定時時間間隔設置爲8小時。

+0

請檢查您的web.config文件延長會話的生命週期。 –

+0

你確定它的會話,而不是表單驗證超時嗎?即他們是否必須重新登錄?另外,您的Cookie到期時間是多少? –

+0

@ayilmaz:我們已經試過了。沒有工作。 – ThirtyOne34

回答

0

快速劈

比形式超時設置會話2分鐘後。這可以確保會話不會在身份驗證死亡的第二秒鐘被終止。但請記住,會話獨立於表單(請參閱this blog)以獲取更多詳細信息。

<system.web> 
    <authentication mode="Forms"> 
     <forms timeout="20" loginUrl="-- Login Page here --"/> 
    </authentication> 

    <sessionState mode="InProc" timeout="22"/> 
</system.web> 

順藤摸瓜

我會嘗試找出哪一個具體的超時。這是一個相當簡單的測試,並且會爲您節省相當多的時間。

因此,所需的部分是那些在1分鐘的超時和會話的10000

<system.web> 
    <authentication mode="Forms"> 
     <forms timeout="1" loginUrl="-- Login Page here --"/> 
    </authentication> 

    <sessionState mode="InProc" timeout="10000"/> 
</system.web> 

所以登錄,瀏覽到一個頁面,等待一分鐘,然後刷新頁面,你應該看到登錄頁面。

在您最喜歡的瀏覽器中,打開開發人員工具欄並瀏覽爲此網站存儲的Cookie。應該有2塊餅乾:

  • ASP.NET_SessionId - 跟蹤會話
  • .ASPXAUTH - 跟蹤您的登錄(除非您的瀏覽器已經刪除了因過期)

你應該看到的是,過期會議時間(ASP.NET_SessionId)在未來,但表格(.ASPXAUTH)已過期。

再次登錄,您的會話應該和以前一樣。

顛倒設置,你會發現相反的情況發生,即你登錄了很長一段時間,但它正在重置。

跟蹤會話結束事件

還有一個你可以嘗試在您的全球ASAX。請確保你的web.config你sessionMode='InProc',並添加了一個方法:

// Only works with sessionMode='InProc' 
protected void Session_End(object sender, EventArgs e) 
{ 
    if(Debugger.IsAttached) 
     Debugger.Break(); 
} 

當會話死了,你可能能夠通過調用堆棧的確切原因追溯爲什麼已經過期的斷點將打。代碼同時調用Session.Abandon()時也會出現這種情況。