我在單個域中有多個應用程序共享表單認證單。我們在每個頁面上都有javascript,會在用戶會話到期前2分鐘提醒用戶,並允許他註銷或延長會話。當倒數到達0時,它們會自動註銷。這一切都很好。但是,當用戶打開多個瀏覽器窗口或選項卡以處理各種應用程序時,它失敗了。如果窗口A在用戶在窗口B中工作時超時,則他們在下一個請求中從B中退出。防止頁面或處理程序更新FormsAuthentication標籤
我有一個解決方案,但我似乎無法實現它。基本上,當頁面呈現時,我會寫出票券發行日期的時間點。然後,在自動註銷時,我想讓ajax調用一個處理程序來查看這些tick是否與當前的formsauthentication ticket ticks匹配。如果它們不匹配,那麼我知道另一個應用程序已經刷新了票據,我不會將它們註銷。問題是我無法創建一個不更新票據的通用處理程序,因爲我們使用slidingingexpiration = true。
function CompareTicket(ticks) {
$.getJSON('http://localhost/MyApp/CompareTicket.ashx?t=' + ticks, function (data) {
if (data == 0)
SessionEnd();
else
SessionExtend();
});
}
在下面的處理程序代碼,如果我發送的查詢字符串值當前票據的蜱匹配數據返回爲0。不幸的是,只需要處理程序的行爲就會更新票證,並始終發回新的計票數量。
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/json";
context.Response.ContentEncoding = Encoding.UTF8;
long ticketTicks = ((FormsIdentity)context.User.Identity).Ticket.IssueDate.Ticks;
if (ticketTicks == 0)
context.Response.Write("0");
else
{
long ticks = 0;
if (long.TryParse(context.Request.QueryString["t"], out ticks))
{
if (ticketTicks == ticks)
context.Response.Write("0");
else
context.Response.Write(ticketTicks.ToString());
}
else
context.Response.Write("0");
}
}
有關如何從服務器獲取JSON請求而不擴展票證的任何想法?