【问题标题】:Is there no way to extend ASP.Net Forms Authentication so that sessions can extend past an iisreset?有没有办法扩展 ASP.Net 表单身份验证,以便会话可以扩展超过 iisreset?
【发布时间】:2011-01-13 12:35:17
【问题描述】:

我刚刚收到另一个帖子的 ping,因为我的应用程序在 iisreset 后没有让用户保持登录状态。

How do I solve an AntiForgeryToken exception that occurs after an iisreset in my ASP.Net MVC app?

我不得不说我同意评论者认为这是人为的限制。

从我读到的有关表单身份验证的内容看来,登录的会话信息似乎都存储在内存中,当服务器重新启动时,您会丢失该信息。

我想做的只是能够将这些信息存储在某个地方,最好是在数据库中,这样我就可以继续我的会话。我似乎找不到任何方法来扩展它来做到这一点。我错过了什么吗?我是否误解了它的工作原理?

我意识到这是他们给我们的“免费”套件,但我不想自己推出,因为他们做对了很多事情,而且我有可能搞砸自己的解决方案。

编辑:请注意,这与会话状态无关。据我所知,我根本没有使用会话状态,除非框架中的某些东西在内部使用它。

我意识到 cookie 已被身份验证使用,但它们尚未过期。不过,在 iisreset 之后,我仍然会跳到登录页面。

【问题讨论】:

    标签: .net asp.net asp.net-mvc iis


    【解决方案1】:

    听起来您的问题是 <machineKey /> validationKeydecryptionKey 属性设置为 AutoGenerate,这意味着它们在 IIS 重置时会发生变化。

    这意味着加密的持久表单身份验证 cookie 在下次出现时将不再有效。

    您可以通过手动配置固定的validationKeydecryptionKey 来解决此问题。为此,请查看这篇文章:

    How To: Configure MachineKey in ASP.NET 2.0

    向下滚动到“Web Farm Deployment Considerations”部分并生成加密随机密钥。

    【讨论】:

      【解决方案2】:

      身份验证会话和“会话状态”(跟踪防伪令牌的地方)在 ASP.NET 中是两个完全独立的东西。

      身份验证(通常)由浏览器中的 cookie 跟踪,因此不会受到 iis 重启的影响。

      会话状态默认存储在内存中(重启后会被杀死),但可以很容易地存储在 SQL Server 或专用的状态服务器进程中(这两个进程都可以运行 iis重启)。

      【讨论】:

      • 是的,如果您不再使用 InProc,那么如果您处于负载平衡环境中,您将在应用程序重新启动和物理服务器移动之间获得会话持久性:请参阅 msdn.microsoft.com/en-us/library/ms178586.aspx 了解有关不同的模式。
      • 你说得对,会话状态是不同的。据我了解,内部存储了一些用于身份验证的状态,以防止过期欺诈等。至少我认为会发生这种情况。无论如何,当我 iisreset 我的应用程序时,他们会将您弹回到下一个请求的登录页面。我不在任何地方使用 Session afaik(除非 ASP.Net MVC 在后台使用)。
      • 服务器内存中没有存储身份验证状态。它只是客户端上的一个加密cookie。 MVC 确实不时使用会话状态来实现它的一些功能。你是从 MVC 演示中构建的吗?也许它正在检查会话变量?
      • 说实话,我的原始问题似乎有一个答案来回答这个问题。我现在只是在验证它。我假设有状态,因为它停止工作,但看起来它实际上可能是因为重新生成了机器密钥。 stackoverflow.com/questions/2206595/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      相关资源
      最近更新 更多