2

我有一个使用 FormsAuthentication 的 ASP.NET 应用程序。每当我重新启动应用程序或 Web 服务器时,我的身份验证令牌都是无效的,我必须重新登录。怎么了?

4

2 回答 2

1

默认情况下,FormsAuthentication 通过让客户端存储数据的加密副本来验证每个请求的身份验证数据。加密密钥存储在Machine.config. 使用的具体密钥在<machineKey decryptionKey="YOUR KEY HERE">.

如果您不提供解密密钥,则会在应用程序启动时自动生成一个。由于是随机生成的,所以每次重启应用都会有所不同。在验证阶段,FormsAuthentication 尝试解密身份验证数据并失败。然后用户不再登录。

有两种方法可以解决这个问题。

  • 提供 machineKey inMachine.config将为 FormsAuthentication 提供一个一致的密钥以供使用,因此验证将通过先前应用程序运行的加密 cookie 成功。
  • 在 Web.config 中使用<forms protection="None" ... />将禁用身份验证数据加密和验证。这是不安全的,只适合开发,因为用户互相模仿是微不足道的。
于 2013-04-15T01:29:27.527 回答
1

除非您另外指定,否则 asp.net 中的默认会话状态模式是进程内(缓存在内存中)。当应用程序关闭时,内存被清除,进程内会话缓存因此丢失。

@dhasenan 只有当应用程序部署在网络场或云中时,机器密钥配置才会成为问题。覆盖 Machinekey 元素的机器级配置的想法是确保多台机器使用完全相同的密钥。

因此,机器密钥应该不是问题,因为如果在应用程序级别未提供机器密钥,则将使用 machine.config 中的机器密钥,它是持久的和静态的,因此不会在会话之间重新生成。

于 2013-04-15T01:41:42.897 回答