【问题标题】:MVC Authentication Timeout Prior to ticket expiration票证到期之前的 MVC 身份验证超时
【发布时间】:2015-01-12 02:54:56
【问题描述】:

我有一个 asp.net MVC 应用程序,它表现出一些奇怪的身份验证超时行为。我们将 web.config 中表单身份验证标记的超时设置为两天。

    <forms loginUrl="~/Login/Index" timeout="2880" />

我们注意到,应用程序在 20 分钟左右超时。因此,在研究了问题并尝试了各种设置之后,我们决定在 Appliconi_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 2014 年 11 月 16 日,9:00:47

登录我看到下一个请求的过期更新成功,但我仍然被发送到登录。

我被难住了。我知道它一定是 IIS 7 中的某些设置导致了这种情况,因为正如我所说,它在 Visual Studio(即 IIS 8 Express)的调试器中工作正常,所以一定有什么地方覆盖了这个功能。

我认为这可能是 MVC 特有的,因为我在另一个站点上使用相同的功能,但没有看到相同的问题。

更新

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

【问题讨论】:

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


【解决方案1】:

好的,所以我终于想出了这个问题的答案。应用程序池达到了 20 分钟的空闲超时设置。因此,在应用程序处于不活动状态 20 分钟后,应用程序池被回收。因此,当用户最终继续时,池将重新初始化,当前的身份验证 cookie 不再有效。

要修改此设置,请进入 IIS 中应用程序池的高级设置。将其设置为 0 将禁用空闲超时,或者您可以将其设置为您认为合适的任何值(以分钟为单位)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多