Cookie混淆与FormsAuthentication.SetAuthCookie()方法

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

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

我的问题是这样的:在web.config文件中,“/system.web/authentication/forms”节点有一个超时属性。 如果我把这个值设置为30分钟,用户在他们的会话过期之前是否处于非活动状态?

我问的原因是不pipe我设置这个值,如果我在SetAuthCookie()中设置持久化为true,cookie集合上的到期时间是90分钟。 如果我在SetAuthCookie()中将持久性设置为false,则将cookie过期设置为“会话结束”。

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

您在/system.web/authentication/formsfind的参数超时是身份validation票证持续时间的超时(以分钟为单位)。

这意味着,在一段时间不活动之后,用户被提示再次login。 如果你试图检查这个My.Profile.Current.IsAuthenticated它将是false

你可以select不坚持cookie。 在这种情况下,如果您的票证过期,您的Cookie也会过期。 cookie(如果持续存在)有目的地记住用户是否回到您的网站。

您可能需要将Cookie保存10年,以便用户不必再次input用户名和密码,除非他们已select删除Cookie。 即使浏览器closures(当它被保留时),cookie也是有效的。

另一个要记住的重要的事情是参数slidingExpiration:

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

如果这是真的,那么每当您的网站有活动时,您的身份validation票都会被更新:刷新页面等。

你能做什么 – 我做了什么 – 就是写下你自己的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 

更新

我已经实现了这个例程,因为我想将我的组存储在一个encryption的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) 

正如你所看到的,我已经设置了身份validationcookie的过期和身份validation票据的超时(只有当持续)。

我尝试过的另一件事是在encryption的cookie中存储用户名和密码。 每次加载masterpage,我检查My.Profile.Current.IsAuthenticated,以查看身份validation是否仍然有效。 如果没有,我再次读取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 

Security.CookieAuth是我创build的一个对象,用于返回用户名和密码。
CookieUserData是存储(我保存在JSON格式),我把我的密码和组。