【发布时间】: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 特有的,因为我在另一个站点上使用相同的功能,但没有看到相同的问题。
更新
忘了提一下,我也没有在事件查看器中看到身份验证票超时记录。
【问题讨论】:
-
另外,这是一个 MVC Razor 站点。如果有帮助的话。
-
不。我有一个指定的机器密钥,但问题仍然存在。
标签: asp.net-mvc vb.net authentication cookies