c# – Cookie与FormsAuthentication.SetAuthCookie()方法混淆

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

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

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

我问的原因是,无论我设置这个值,如果我在SetAuthCookie()中设置持久性为true,cookie集的到期是90分钟。如果我在SetAuthCookie()中设置持久性为false,那么cookie期满被设置为“会话结束”。

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

您在/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格式),我把我的密码和组。

http://stackoverflow.com/questions/4939533/cookie-confusion-with-formsauthentication-setauthcookie-method

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – Cookie与FormsAuthentication.SetAuthCookie()方法混淆