C# ASP.NET FormsAuthentication:重新启动应用程序时必须重新登录

C# ASP.NET FormsAuthentication:重新启动应用程序时必须重新登录,c#,asp.net,forms-authentication,C#,Asp.net,Forms Authentication,我有一个使用FormsAuthentication的ASP.NET应用程序。每当我重新启动应用程序或web服务器时,我的身份验证令牌无效,我必须再次登录。出了什么问题?默认情况下,FormsAuthentication通过让客户端存储数据的加密副本来验证每个请求上的身份验证数据。加密密钥存储在Machine.config中。要使用的特定键位于中 如果您不提供解密密钥,则会在应用程序启动时自动生成一个解密密钥。由于它是随机生成的,因此每次重新启动应用程序时都会有所不同。在验证阶段,FormsAut

我有一个使用FormsAuthentication的ASP.NET应用程序。每当我重新启动应用程序或web服务器时,我的身份验证令牌无效,我必须再次登录。出了什么问题?

默认情况下,FormsAuthentication通过让客户端存储数据的加密副本来验证每个请求上的身份验证数据。加密密钥存储在
Machine.config
中。要使用的特定键位于

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

解决这个问题有两种方法

  • Machine.config
    中提供machineKey将为FormsAuthentication提供一个一致的密钥以供使用,因此验证将成功地使用以前运行的应用程序中加密的cookie
  • 在Web.config中使用
    将禁用身份验证数据加密和验证。这是不安全的,并且只适合于开发,因为用户相互模拟是微不足道的

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

      @dhasenan只有当应用程序跨web场或云部署时,machinekey配置才会成为问题。重写Machinekey元素的机器级别配置的想法是确保多台机器使用完全相同的键


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

      谢谢你启发我。MSDN同意:具体看一下配置以加密表单身份验证票证