您在中找到的参数超时/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
Update
我已经实现了这个例程,因为我想将我的组存储在加密的 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,获取用户名和密码,然后在数据库上检查:
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 格式保存)。