Cookie 与 FormsAuthentication.SetAuthCookie() 方法混淆

Posted

技术标签:

【中文标题】Cookie 与 FormsAuthentication.SetAuthCookie() 方法混淆【英文标题】:Cookie Confusion with FormsAuthentication.SetAuthCookie() Method 【发布时间】:2011-06-23 19:07:06 【问题描述】:

所以 *** 上有很多关于此的帖子,但我仍然无法解决我的确切问题。这是要点:

我有一个需要身份验证的网站。我正在使用标准的 .NET FormsAuthentication.SetAuthCookie() 方法来保持用户的会话。

我的问题是:在 web.config 文件中,“/system.web/authentication/forms”节点有一个超时属性。如果我将此值设置为 30 分钟,这是否是用户在会话到期之前可以拥有的用户不活动时间?

我问的原因是,无论我将此值设置为什么,如果我在 SetAuthCookie() 中将持久性设置为 true,则 cookie 集的到期时间为 90 分钟。如果我在 SetAuthCookie() 中将持久性设置为 false,则 cookie 过期设置为“会话结束”。

实际设置的“超时”属性值是什么,如何获得持续一个月或一年或更长时间的持久 cookie?

【问题讨论】:

【参考方案1】:

您在/system.web/authentication/forms 中找到的参数 timeout 是身份验证票证持续时间的超时时间(以分钟为单位)。

这意味着在一段时间不活动后,系统会提示用户再次登录。如果您尝试检查此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 中。 每次加载母版页时,我都会检查 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 格式)。

【讨论】:

嗨,对不起,我知道这已经太旧了,但只是好奇,为什么要以 json 格式存储它?密码和组。我对 mvc 很陌生,所以我仍在尝试理解使用它进行开发的概念和最佳实践。谢谢! @gdubs:是的,我知道。这有点不寻常。我本可以选择另一种格式,但我喜欢 JSON。再加上 MVC,您往往会大量使用 JSON,因此我将其作为标准接受。 区别:slidingExpiration vs time Expiration vs Persistent cookie ? 如果 IIS 应用程序池回收? 如果空闲则关闭工作进程并回收工作进程身份验证cookie未过期,会话过期。 如果修改 Global.asax 或 Web.config,或 Bin 文件夹

以上是关于Cookie 与 FormsAuthentication.SetAuthCookie() 方法混淆的主要内容,如果未能解决你的问题,请参考以下文章

会话 Cookie 与持久性 Cookie

iOS开发WKWebView Cookie的读取与写入,与UIWebView的Cookie共享

Web专题二:Cookie与Session

Web专题二:Cookie与Session

javaWEB与cookie

cookie 与 session 的区别与联系