2011-02-08 266 views
37

所以有很多關於此StackOverflow的帖子,但我仍然無法解決我確切的問題。這裏的要點:Cookie混淆與FormsAuthentication.SetAuthCookie()方法

我有一個網站,需要認證。我正在使用標準的.NET FormsAuthentication.SetAuthCookie()方法來保持用戶的會話。

我的問題是這樣的:在web.config文件中,「/system.web/authentication/forms」節點有一個超時屬性。如果我將這個值設置爲30分鐘,用戶在他們的會話過期之前是否處於非活動狀態?

我問的原因是,無論我將此值設置爲什麼,如果我在SetAuthCookie()中將持久性設置爲true,則Cookie集合上的到期時間爲90分鐘。如果我在SetAuthCookie()中將持久性設置爲false,則Cookie過期將設置爲「會話結束」。

什麼是「超時」屬性值實際設置,以及如何獲得持續一個月或一年或更長時間的持久性cookie?

回答

44

您在/system.web/authentication/forms中發現的參數超時是身份驗證票證持續時間的超時(以分鐘爲單位)。

這意味着在一段時間不活動之後,系統會提示用戶再次登錄。如果您嘗試檢查此My.Profile.Current.IsAuthenticated它將是false

您可以選擇不堅持Cookie。在這種情況下,如果您的票證過期,您的Cookie也會過期。 Cookie(如果持續存在)有目的地記住用戶是否回到您的網站。

您可能想要將Cookie保留10年,以便用戶不必再次插入用戶名和密碼,除非他們已選擇刪除cookie。即使瀏覽器處於關閉狀態(持續存在時),Cookie也是有效的。

要記住另一個重要的事情是參數slidingExpiration:

<authentication mode="Forms"> 
    <forms loginUrl="~/Partner/LogOn" defaultUrl="~/Home/Index" 
      timeout="30" slidingExpiration="true" /> 
</authentication> 

如果這是真的你的身份驗證票證將更新每次有您的網站上的活動時間:頁面的刷新等

什麼你可以做 - 和我做了什麼 - 是寫自己的cookie這樣的:

FormsAuthenticationTicket authTicket = new 
    FormsAuthenticationTicket(1, //version 
    userName, // user name 
    DateTime.Now,    //creation 
    DateTime.Now.AddMinutes(30), //Expiration (you can set it to 1 month 
    true, //Persistent 
    userData); // additional informations 

更新

我實現了這個程序,因爲我想我的存儲組加密的Cookie:

Dim authTicket As System.Web.Security.FormsAuthenticationTicket = _ 
     New System.Web.Security.FormsAuthenticationTicket(_ 
      1, _ 
      UserName, _ 
      Now, _ 
      Now.AddYears(100), _ 
      createPersistentCookie, _ 
      UserData) 

Dim encryptedTicket As String = System.Web.Security.FormsAuthentication.Encrypt(authTicket) 

Dim authCookie As HttpCookie = New HttpCookie(_ 
    System.Web.Security.FormsAuthentication.FormsCookieName, _ 
    encryptedTicket) 

If (createPersistentCookie) Then 
    authCookie.Expires = authTicket.Expiration 
End If 

Response.Cookies.Add(authCookie) 

正如你可以看到我已經設置了身份驗證cookie,並與認證憑證的到期相同的超時時間(僅當持續存在時)。

我試過的另一件事是在加密的cookie中存儲用戶名和密碼。 每次加載masterpage時,我都檢查My.Profile.Current.IsAuthenticated以查看認證是否仍然有效。如果不是我再次讀取cookie,獲得用戶名和密碼,並檢查它的DB:

Public Function ReadCookieAuthentication(ByVal Context As System.Web.HttpContext) As Security.CookieAuth 

    Dim CookieUserData = New Security.CookieAuth() 

    Dim cookieName As String = System.Web.Security.FormsAuthentication.FormsCookieName 
    Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName) 

    If (Not (authCookie Is Nothing)) Then 
     Dim authTicket As System.Web.Security.FormsAuthenticationTicket = Nothing 
     Try 
      authTicket = System.Web.Security.FormsAuthentication.Decrypt(authCookie.Value) 
      If (Not (authTicket Is Nothing)) Then 
       If (authTicket.UserData IsNot Nothing) AndAlso Not String.IsNullOrEmpty(authTicket.UserData) Then 
        CookieUserData = New JavaScriptSerializer().Deserialize(Of Security.CookieAuth)(authTicket.UserData.ToString) 
       End If 
       CookieUserData.UserName = authTicket.Name 
      End If 
     Catch ex As Exception 
      ' Do nothing. 
     End Try 
    End If 

    Return (CookieUserData) 

End Function 

Security.CookieAuth是我創建返回用戶名和密碼的對象。
CookieUserData是我放置密碼和組的存儲(我保存爲json格式)。

+1

嗨,對不起,我知道這已經太老了,但只是好奇,爲什麼把它存儲在json格式?密碼和組。 我對mvc非常陌生,所以我仍然試圖理解使用它進行開發的概念和最佳實踐。 謝謝! – gdubs 2011-06-09 04:15:34