与FormsAuthentication.SetAuthCookie()方法的Cookie混淆

Jas*_*son 39 .net c# cookies

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

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

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

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

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

Lef*_*tyX 48

您找到的参数超时/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>
Run Code Online (Sandbox Code Playgroud)

如果确实如此,每当您的网站上有活动时,您的身份验证票证都会续订:刷新页面等.

你能做什么 - 以及我做了什么 - 就是写下你自己的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
Run Code Online (Sandbox Code Playgroud)

更新

我已经实现了这个例程,因为我想将我的组存储在加密的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)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我已将身份验证cookie和身份验证票证的到期时间设置为相同的超时(仅在保留时).

我尝试过的另一件事是在加密的cookie中存储用户名和密码.每次加载母版页时,我都会检查My.Profile.Current.IsAuthenticated以查看验证是否仍然有效.如果没有,我再次读取cookie,获取用户名和密码,并在数据库上检查:

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
Run Code Online (Sandbox Code Playgroud)

Security.CookieAuth是我创建的用于返回用户名和密码的对象.
CookieUserData是我存储密码和组的存储(我以json格式保存).

  • @gdubs:是的,我知道.这有点不寻常.我可以选择其他格式,但我喜欢JSON.再加上MVC,你倾向于使用JSON,所以我已经把它作为一个标准. (3认同)