none
如何在瀏覽器關閉時自動登出? RRS feed

  • 問題

  • 各位大大好:
    小弟有個問題就是我使用FormsAuthentication的方式做登入登出的管理
    要如何能防止使用者沒有登出就將瀏覽器關閉,造成若在cookie失效前又開相同網頁卻不必登入的狀態
    剛剛爬文有發現這篇: http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=2824229&SiteID=14
    但是我試了那段程式碼,發現不行耶!
    我關閉瀏覽器之後,重新再開一樣的頁面,還是一樣沒有登出
    而且變成連真正做了登出動作,也沒有登出了
    以下是我的程式碼片段,請幫我看看是錯在哪裡?? 謝謝喔!

    In 登入按鈕


    If 帳號密碼正確 Then
        Dim strUsername As String = "使用者名稱"
        Dim ticket As New FormsAuthenticationTicket( _

                              1, _

                              strUsername, _

                              DateTime.Now, _

                              DateTime.Now.AddMinutes(5), _

                              False, _

                              "", _

                              FormsAuthentication.FormsCookiePath _

                              )

        ' Encrypt the ticket.
        Dim encTicket As String = FormsAuthentication.Encrypt(ticket)

        ' Create the cookie.
        Response.Cookies.Add(New HttpCookie(FormsAuthentication.FormsCookieName, encTicket))

        ' Redirect back to original URL.
        FormsAuthentication.RedirectFromLoginPage(strUsername, True)
    Else
        Label1.Text = "登入錯誤"
    End If

     

     

    In 登出按鈕

    FormsAuthentication.SignOut()
    FormsAuthentication.RedirectToLoginPage()

     


    謝謝唷!!

    2008年2月20日 上午 05:27

解答

  • 你必須關閉所有 Browser 視窗才會將 Cookie 清除喔!


    ----
    From: Will
    Blog: http://blog.miniasp.com/
    記載著 Will 在網路世界的學習心得與技術分享

     

    2008年2月20日 上午 07:07
  • 你先看一下 MSDN 摟,建議你養成先查資料不懂或查不到資料再發問的習慣:

     

    FormsAuthenticationTicket 建構函式 (Int32, String, DateTime, DateTime, Boolean, String, String)

    http://msdn2.microsoft.com/zh-tw/library/kybcs83h.aspx

     

    userData 的資料會跟你的 Ticket Cookie 放在一起(加密過),要取用的話可以參考以下文件:

     

    FormsAuthenticationTicket..::.UserData 屬性
    http://msdn2.microsoft.com/zh-tw/library/system.web.security.formsauthenticationticket.userdata.aspx

    但你要特別注意 UserData 屬性中的資料量不能太大,因為這些資料是放在 Cookie 中的,放太多資料會導致 Cookie 無效。


    ----
    From: Will
    Blog: http://blog.miniasp.com/
    記載著 Will 在網路世界的學習心得與技術分享

    2008年2月20日 下午 12:54
  • version 隨便你設定,修改他沒啥意義。

     

    Cookie 有兩種:Persistent Cookie 與 Session Cookie

     

    Persistent Cookie

    這種 Cookie 可以存在 Browser 一段時間,即便 Browser 全部關閉再開也會有,但有時間限制。

     

    Session Cookie

    這種 Cookie 只有 Browser 不關閉,就會一直存在,但 Browser 全部關閉後 Cookie 會自動被清除。

     

    如果你設定 isPersistent 為 True 的話,預設 ASP.NET 會儲存 30 分鐘。


    ----
    From: Will
    Blog: http://blog.miniasp.com/
    記載著 Will 在網路世界的學習心得與技術分享

    2008年2月20日 下午 03:00

所有回覆

  • 你必須關閉所有 Browser 視窗才會將 Cookie 清除喔!


    ----
    From: Will
    Blog: http://blog.miniasp.com/
    記載著 Will 在網路世界的學習心得與技術分享

     

    2008年2月20日 上午 07:07
  • 可以了!!

    我想問題可能出在我使用了 FormsAuthentication.RedirectFromLoginPage(xxxx) 去跳轉登入後的頁面

    是不是這樣之後就必須用回傳統的 Response.Redirect 了?

    因為 FormsAuthentication.RedirectFromLoginPage 本身又會建立一個 cookie

    我剛剛試的結果是這樣耶..

     

    另外想請問幾個問題(因為不想只知其然^^),在建構涵式中:

    Code Snippet
    Dim ticket As New FormsAuthenticationTicket( _
      1, _
      strUsername, _
      DateTime.Now, _
      DateTime.Now.AddMinutes(1), _
      False, _
      "", _
      FormsAuthentication.FormsCookiePath _
      )

     

    第一個參數 version As Integer 是做什麼用的?? 正確應該給什麼值? 還是說無所謂,隨便給即可?

    接下來的 name, issueDate 以及 expiration 三個參數沒問題

    第五個參數 isPersistent 我試過給 True 或 False 都沒可以用,那它是做什麼用的呀??

    再來就是 userData 參數我知道顧名思義它可以存放一些使用者資料,,

    但是一般這裡會放些什麼資料呢? 事後若需取用這些資料的話又該如何取用呢?

     

    謝謝保哥大大的回覆喔!

     

    2008年2月20日 下午 12:43
  • 你先看一下 MSDN 摟,建議你養成先查資料不懂或查不到資料再發問的習慣:

     

    FormsAuthenticationTicket 建構函式 (Int32, String, DateTime, DateTime, Boolean, String, String)

    http://msdn2.microsoft.com/zh-tw/library/kybcs83h.aspx

     

    userData 的資料會跟你的 Ticket Cookie 放在一起(加密過),要取用的話可以參考以下文件:

     

    FormsAuthenticationTicket..::.UserData 屬性
    http://msdn2.microsoft.com/zh-tw/library/system.web.security.formsauthenticationticket.userdata.aspx

    但你要特別注意 UserData 屬性中的資料量不能太大,因為這些資料是放在 Cookie 中的,放太多資料會導致 Cookie 無效。


    ----
    From: Will
    Blog: http://blog.miniasp.com/
    記載著 Will 在網路世界的學習心得與技術分享

    2008年2月20日 下午 12:54
  • 嗯..我有先看過MSDN的說明耶~只是MSDN說的....看不懂@.@

    MSDN中只說了 version 是 版本號碼, 嗯..我不懂的是 "版本號碼" 是做什麼用的,

    是一個可以任意給的號碼嗎? 例如我們網站的版本?

    再, isPersistent 它說 "跨瀏覽器工作階段儲存", 它的意思是不是:

    假設 a.aspx , b.aspx , c.aspx 三個頁面皆有保護的程式碼,然後---

    若設為 True 時則---

    從 login.aspx 登入, 登入後轉往 a.aspx 爾後可以任意在 b.aspx  c.aspx 中任意瀏覽,都會維持登入狀態

    若設為 False 時則---

    從 login.aspx 登入, 登入後轉往 a.aspx 爾後在瀏覽其它網頁時就不會 "持續" 登入狀態

    但若是這樣的話.....跟我實際測試的結果有出入耶

    不論我給 True 或 False , 登入後皆可在任何有保護的頁面中瀏覽.....

     

    另外關於 userData 參數...呵~~因為沒有把它跟 UserData 屬性聯想到一起

    所以之前沒找想到要去 FormsAuthenticationTicket 的 UserData 屬性去查

    原來它直接用 .UserData 取用即可~~ 不好意思啦 ^.^" 找您的麻煩了~

     

     

    2008年2月20日 下午 01:20
  • 不好意思,剛剛忘了,再問一個:

    如此設定了 expiration 參數,

    那麼 web.config 裡的 <authentication> → <Forms timeout="xxx"> 是否就無意義了?

    我剛試了一下,好像是這樣~

     

     

    2008年2月20日 下午 01:47
  • version 隨便你設定,修改他沒啥意義。

     

    Cookie 有兩種:Persistent Cookie 與 Session Cookie

     

    Persistent Cookie

    這種 Cookie 可以存在 Browser 一段時間,即便 Browser 全部關閉再開也會有,但有時間限制。

     

    Session Cookie

    這種 Cookie 只有 Browser 不關閉,就會一直存在,但 Browser 全部關閉後 Cookie 會自動被清除。

     

    如果你設定 isPersistent 為 True 的話,預設 ASP.NET 會儲存 30 分鐘。


    ----
    From: Will
    Blog: http://blog.miniasp.com/
    記載著 Will 在網路世界的學習心得與技術分享

    2008年2月20日 下午 03:00
  • 喔~~原來是這樣,我懂了

    感謝保哥一路下來的解答,謝謝!!

     

     

    2008年2月21日 上午 01:27