2008-12-01 48 views
1

我需要撤銷的驗證cookie,如果用戶不再存在(或其他條件)後,窗體身份驗證機制已經從瀏覽器接收到驗證cookie後並已驗證它。即這裏是使用場景:撤銷認證,並重定向到登錄頁面FormsAuthentication已經驗證過的用戶

  1. 該用戶已通過身份驗證,並授予未過期的身份驗證cookie。
  2. 再過幾天,用戶試圖再次訪問我的web應用程序,並作爲cookie有效期,窗體身份驗證機制將授予訪問權限。

  3. 現在我要進行第二次檢查(我想要的任何條件),並決定如果我想,讓用戶繼續或撤銷認證。

問題是 - 是否有一個官方的自動化方式呢?到目前爲止,我有一些可能性,但我不知道哪一個更好。我可以在Global.asax中捕捉Authenticate事件,檢查我想做的事情,並撤銷我清除cookie的,然後其中的一個:

  1. 重定向再次相同的URL - 這應該工作,因爲這時候表單身份驗證將失敗,並且它將重定向到登錄頁面。

  2. 拋出一些異常?哪一個使重定向發生w/o我指定什麼?

  3. 莫名其妙地得到配置文件中的登錄頁面URL(任何想法如何/使用哪個配置的處理程序),並直接重定向?

  4. 一些FormsAuthentication類/方法我都忽略了,這是專爲這個?

  5. 還有其他想法嗎?

回答

3

我不認爲有一種自動的方法來實現這一點。 我認爲最好的方法是將日期添加到auth cookie,這將是您最後一次檢查用戶是否存在。 因此,當一個用戶登錄,你會:

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
       1, // Ticket version 
       name, // Username associated with ticket 
       DateTime.Now, // Date/time issued 
       DateTime.Now.AddMonths(1), // Date/time to expire 
       true, // "true" for a persistent user cookie 
       DateTime.Now.ToUniversalTime(), // last time the users was checked 
       FormsAuthentication.FormsCookiePath);// Path cookie valid for 

     // Encrypt the cookie using the machine key for secure transport 
     string hash = FormsAuthentication.Encrypt(ticket); 
     HttpCookie cookie = new HttpCookie(
      FormsAuthentication.FormsCookieName, // Name of auth cookie 
      hash); // Hashed ticket 

     cookie.HttpOnly = true; 

     // Set the cookie's expiration time to the tickets expiration time 
     if (ticket.IsPersistent) cookie.Expires = ticket.Expiration; 
     //cookie.Secure = FormsAuthentication.RequireSSL; 
     Response.Cookies.Add(cookie); 

然後每次用戶在authenicated你可以檢查你傳遞給身份驗證票,並在10個分鐘的時間間隔或對數據庫是否仔細檢查少了額外的日期用戶存在。 的代碼可能是這個樣子:

public void FormsAuthentication_OnAuthenticate(object sender, 
          FormsAuthenticationEventArgs args) 
    { 
     if (FormsAuthentication.CookiesSupported) 
     { 
      if (Request.Cookies[FormsAuthentication.FormsCookieName] != null) 
      { 
       try 
       { 
        FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(
         Request.Cookies[FormsAuthentication.FormsCookieName].Value); 

        DateTime lastCheckedTime = DateTime.TryParse(ticket.UserData); 
        TimeSpan elapsed = DateTime.Now - lastCheckedTime; 
        if (elapsed.TotalMinutes > 10)//Get 10 from the config 
        { 
         //Check if user exists in the database. 
         if (CheckIfUserIsValid()) 
         { 
          //Reset the last checked time 
          // and set the authentication cookie again 
         } 
         else 
         { 
          FormsAuthentication.SignOut(); 
          FormsAuthentication.RedirectToLoginPage(); 
          return; 
         } 
        } 

       } 
       catch (Exception e) 
       { 
        // Decrypt method failed. 
       } 
      } 
     } 
    } 

你甚至可以高速緩存已刪除的最後10分鐘的用戶,並覈對該集合。

希望有所幫助。

+0

是的,RedirectToLoginPage是我之後的事......我沒有找到它,因爲這是1.1項目。我需要遷移。謝謝。 – 2008-12-02 15:24:46

0

如果您拒絕了一些其他的原因,而不是過期的會話cookie,那麼我認爲你應該將用戶重定向到一個網頁,介紹他們需要爲了獲得做什麼。如果再次登錄就足夠了,那麼登錄頁就足夠了。然而,這聽起來像是有條件下再次登錄是不可能的。在這種情況下,最好將用戶重定向到合適的錯誤頁面,以說明他們無法訪問站點的原因,並說明如何再次訪問(如果可能)。

相關問題