MVC身份验证超时在故障单到期之前

时间:2014-11-14 16:34:50

标签: asp.net-mvc vb.net authentication cookies

我有一个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特有的,因为我在其他网站上使用相同的功能而且没有看到同样的问题。

更新

忘记提及,我也没有在事件查看器中看到身份验证票证超时记录。

1 个答案:

答案 0 :(得分:1)

好的,所以我终于找到了这个问题的答案。应用程序池的空闲超时设置为20分钟。因此,在应用程序停用20分钟后,应用程序池被回收。因此,当用户最终继续时,池将重新初始化,并且当前的认证cookie不再有效。

要修改此设置,请进入IIS中应用程序池的高级设置。将其设置为0将禁用空闲超时,或者您可以将其设置为您确定合适的分钟数。