2

我在單個域中有多個應用程序共享表單認證單。我們在每個頁面上都有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請求而不擴展票證的任何想法?

回答

0

爲了得到這個結果,您有多個應用程序共享相同的表單身份驗證令牌用於SSO的目的。當一個應用程序過期了令牌時,您希望它在當時所有其他「開放」應用程序中檢測到此情況。

由於令牌只是一個cookie,因此您可以配置連續運行的javascript函數(比如說每30秒)來檢測窗體auth cookie的存在。如果它消失(因爲它將被註銷/過期),您可以使用該腳本來拋出一些警報等。

無論打開多少個窗口或運行哪些應用程序,這都可以工作。只要cookie存在,您就可以假設(客戶端)用戶已通過身份驗證。

1

在asp.net請求生命週期認證模塊在httphandlers之前執行。一種解決方法是刪除特定網址的身份驗證模塊,以便在遇到httphandler時它不會更新您的票證。像這樣的東西

<location path="/MyApp/CompareTicket"> 
    <system.web> 
     <httpModules> 
      <remove name="FormsAuthenticationModule"/> 
     </httpModules> 
    </system.web> 
</location>