【问题标题】:MVC 3/ASPNET Auth - Almost Randomly Redirecting To Account/LogOffMVC 3/ASPNET Auth - 几乎随机重定向到帐户/注销
【发布时间】:2012-11-08 13:51:25
【问题描述】:

这对我来说是一个非常奇怪的问题,我已经和它斗争了一段时间了。我真的希望有人可以提供帮助。

我有一个相当典型的 MVC 3 网站,我似乎只在 IE 和 Firefox 中遇到这个问题。 Chrome 玩得很好。我很幸运,目前我们公司的大多数客户都使用 Chrome。

问题出现在一个看似随机的时间点,当我点击一个链接时,浏览器会自动将我重定向到 Account/LogOff 操作,然后它显然会从那里返回到登录页面。然后,此链接将以相同的行为继续。

我说“看似随机”是因为今天该链接将起作用,明天它将不起作用,并且所有其他(或大多数 - 我从来没有超过一次给出此问题的问题链接)链接会很好。有时重新启动服务器/开发环境会解决问题,有时则不会。浏览器将继续重定向到 LogOff。

我已尝试查看引荐来源网址,但永远无法到达所引荐的控制器/操作。 (如果我在操作中放置断点,则会错过它,到达的下一个点将是 LogOff 操作)

如果我在注销操作中查看堆栈跟踪,我看不到应用程序来自何处的任何信息。我也尝试了此页面中的建议:Posting the Stack Trace on ASP.NET MVC,但我不明白为什么我被重定向到 LogOff 操作。

我似乎能够在点击 LogOff 之前命中断点的唯一地方是 Global.asax 中的 Application_BeginRequest,但看不到它从那里开始的地方。

我的猜测是,在某个地方,ASPNET Auth 决定不再对用户进行身份验证并重定向到 LogOff 操作。问题是与 ASPNET Auth 关联的 cookie 都仍然存在,其中有数据并且它们还没有过期。

无论如何,我希望我已经就这个问题提供了足够的信息。

提前致谢。

[编辑]

好的,所以我可能更接近了一步。我遇到了this link,并查看了 global.asax 中的 Application_AuthenticateRequest 中发生了什么。

我不太清楚为什么,当我点击一个链接时,Application_AuthenticateRequest 会被访问 3 次。当链接有效时(因为我可以关注它并且它不会让我退出),.ASPAUTH cookie 的值保持不变。我通过添加断点和监视来检查这一点

HttpContext.Current.Request.Cookies[".ASPXAUTH"].Value

链接失效时,cookie第一次有值,后两次为null。因此,由于 ASPXAUTH cookie 为空,系统会自动重定向到 LogOut 操作。

如果我考虑他们在链接中发布的解决方案,我不确定这是否适用于我。据我所知,加密的 cookie 仍然很小(几百个字符长)并且不接近 4096 字节。此外,在我测试断开的链接时,我只有 3 个 cookie,并且在任何给定时间我最多有 5 个 cookie。

有什么想法吗?

【问题讨论】:

  • 您是否尝试过使用 Glimpse 之类的东西来让您更深入地了解正在发生的事情?
  • 会试一试,谢谢。
  • 您使用的是共享主机还是环境中的多个服务器?
  • 它发生在我们的共享主机环境中,当我在本地机器上运行所有东西时。不过,这个问题在我的本地机器上更经常发生。
  • @BradChristie 不确定我在寻找什么,但使用 Glimpse,这是我在单击一个坏掉的链接后得到的:* 我所有的会话都保持不变。 * Cookies 都还在。 * 在 Trace 选项卡中,它只显示: - CreateControllerInterceptor.CreateController(requestContext, "Account") = Jade.Web.Controllers.AccountController - IDependencyResolver.GetService() = ASP._Page_Views_Account_LogOn_cshtml 是一种准确查看的方法在单击链接和被重定向到注销操作之间发生了什么?

标签: asp.net-mvc-3 logoff redirect


【解决方案1】:

好的,所以我有一种关于 cookie 过期的预感。所以我研究了是否有办法让(强制)表单身份验证中的 cookie 保持活动状态,这让我找到了http://www.codeproject.com/Articles/221889/How-to-Generate-Machine-Key-in-IIS7

我可以测试这个理论的唯一方法是继续正常工作和调试网站。 (这就是为什么我花了这么长时间才发布这个答案的原因。)自从我介绍了这个解决方案以来,问题似乎已经解决了。

有趣的是,前几天我与一位拥有 20 年开发经验的架构师讨论了我的问题。他查看了我的代码,确信这是表单身份验证代码中的错误。

我希望这可以帮助一些遇到与我相同问题的人。

【讨论】:

  • 聚会太晚了,但是对于那些对为什么缺少机器密钥会导致用户注销感兴趣的人来说:当每次应用程序因任何原因重新启动时(内存不足,手动,应用程序池回收)机器密钥更改。所以 cookie 是用旧机器密钥生成的,不再有效,用户将被重定向到登录页面。
猜你喜欢
  • 2011-05-11
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 2013-03-25
  • 2017-03-15
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多