我有一个asp.net MVC应用程序,它表现出一些奇怪的身份验证超时行为。我们将web.config中表单身份验证标记的超时设置为两天。
<forms loginUrl="~/Login/Index" timeout="2880" />
我们注意到的是应用程序在20分钟左右超时。因此,在研究问题并尝试各种设置之后,我们决定将代码添加到Applicatoni_AuthenticateRequest方法中的global.asax,该方法从cookie中读取票证,并更新到期日。
Sub Application_AuthenticateRequest(sender As Object, e As EventArgs)
Dim authCookie As HttpCookie = Context.Request.Cookies(FormsAuthentication.FormsCookieName)
If (IsNothing(authCookie) OrElse authCookie.Value = "") Then
Return
End If
Dim authTicket As FormsAuthenticationTicket
Try
authTicket = RefreshLoginCookie()
Catch
Return
End Try
'string[] roles = authTicket.UserData.Split(';');
'if (Context.User != null) Context.User = new GenericPrincipal(Context.User.Identity, roles);
End Sub
Function RefreshLoginCookie() As FormsAuthenticationTicket
Dim authCookie As HttpCookie = HttpContext.Current.Request.Cookies(FormsAuthentication.FormsCookieName)
If (IsNothing(authCookie) OrElse authCookie.Value = "") Then
Return Nothing
End If
Dim oldTicket As FormsAuthenticationTicket = FormsAuthentication.Decrypt(authCookie.Value)
Dim expiryDate As Date = DateTime.Now.Add(FormsAuthentication.Timeout)
HttpContext.Current.Response.Cookies.Remove(FormsAuthentication.FormsCookieName)
Dim newTicket As FormsAuthenticationTicket = New FormsAuthenticationTicket(oldTicket.Version, oldTicket.Name, oldTicket.IssueDate, expiryDate, oldTicket.IsPersistent, oldTicket.UserData, oldTicket.CookiePath)
authCookie.Value = FormsAuthentication.Encrypt(newTicket)
authCookie.Expires = expiryDate
HttpContext.Current.Response.Cookies.Add(authCookie)
Return newTicket
End Function
在visual studio 2012调试器中测试它一切都很好,但是一旦我们将它部署到IIS 7环境,就会返回超时问题。
为了帮助我进行调试,我将Cookie过期设置为与故障单过期时相同,以便我可以轻松告知故障单的设置。
当超时发生时,我发现过期应该发生在11月16日,但那不是发生的事情:
这是cookie信息(至少是相关信息) 名称到期 .ASPXAUTH 11/16 / 2014,9:00:47
放入登录我看到过期更新在下一个请求中成功,但我仍然被发送到登录。
我很难过。我知道它必须是IIS 7中的一些设置导致这种情况,因为正如我所说的,它在visual studio(即IIS 8 Express)的调试器中工作正常,因此必须有某些地方覆盖此功能。
我认为它可能是MVC特有的,因为我在其他网站上使用相同的功能而且没有看到同样的问题。
更新
忘记提及,我也没有在事件查看器中看到身份验证票证超时记录。
答案 0 :(得分:1)
好的,所以我终于找到了这个问题的答案。应用程序池的空闲超时设置为20分钟。因此,在应用程序停用20分钟后,应用程序池被回收。因此,当用户最终继续时,池将重新初始化,并且当前的认证cookie不再有效。
要修改此设置,请进入IIS中应用程序池的高级设置。将其设置为0将禁用空闲超时,或者您可以将其设置为您确定合适的分钟数。