我有一个使用FormsAuthentication的ASP.NET应用程序。每当我重新启动应用程序或Web服务器时,我的身份验证令牌都无效,我必须再次登录。出了什么问题?
答案 0 :(得分:1)
默认情况下,FormsAuthentication通过让客户端存储数据的加密副本来验证每个请求的身份验证数据。加密密钥存储在Machine.config
中。要使用的具体密钥位于<machineKey decryptionKey="YOUR KEY HERE">
。
如果您未提供解密密钥,则会在应用程序启动时自动生成一个解密密钥。由于它是随机生成的,因此每次重新启动应用程序时都会有所不同。在验证阶段,FormsAuthentication尝试解密身份验证数据并失败。然后用户不再登录。
有两种方法可以解决这个问题。
Machine.config
中提供machineKey将为FormsAuthentication提供一致的密钥,因此验证将在之前的应用程序运行时使用加密的cookie成功。<forms protection="None" ... />
将禁用身份验证数据加密和验证。这是不安全的,只适合开发,因为用户互相冒充是微不足道的。答案 1 :(得分:1)
除非另行指定,否则asp.net中的默认会话状态模式是in-proc(缓存在内存中)。当应用程序关闭时,内存将被清除,因此进程内会话缓存将丢失。
@dhasenan如果应用程序部署在Web场或云中,则machinekey配置只会成为问题。覆盖Machinekey元素的机器级配置的想法是确保多台机器使用完全相同的密钥。
因此,机器密钥不应该是一个问题,因为如果在应用程序级别没有提供一个机器密钥,则将使用machine.config中的机器密钥,它将保持静态,因此不会重新生成会议之间。