我们为客户提供了一个Web表单项目,可以保持"超时"并在填写管理区域中的信息时定期记录用户。我们在之前的项目中碰到了类似的东西,但是能够通过以下方式解决这个问题:
if (RememberMe.Checked)
{
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket((string)r["Login"], true, (90*24*60));
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
cookie.Expires = authTicket.Expiration;
HttpContext.Current.Response.Cookies.Set(cookie);
Response.Redirect(FormsAuthentication.GetRedirectUrl((string)r["Login"], false), true);
}
else
{
FormsAuthentication.SetAuthCookie((string)r["Login"], false);
FormsAuthentication.RedirectFromLoginPage((string)r["Login"], false);
}
当我在新项目上尝试相同的方法时,它没有任何效果。我能想出的唯一区别(经过多次重写和调整之后)是新项目使用的是.NET 4.5,而它的工作原理是.NET 4.0。这是4.5中的一个错误,还有其他人遇到过这个吗?
我们将新项目降级到4.0只是为了看到它,到目前为止它看起来完美无需任何额外的代码更改。我的大多数搜索都会得到答案,这些答案会给出一个看起来几乎与我已经完成的代码示例。
答案 0 :(得分:1)
如果其他人遇到同样的问题,我们在此处找到了解决方案:http://blog.falafel.com/asp-net-forms-authentication-times-out-on-a-shared-host/
因为该应用程序没有自己的machineKey,所以它继承了服务器的machine.config中的那个。这个配置为自动生成,因为它是由多个客户共享的服务器,如果它们共享相同的密钥将是一个主要的安全漏洞。因为密钥是自动生成的,所以每次应用程序重置时它都会重新生成,并且无法解密先前分发的Forms Authentication cookie。
我需要为我的应用程序设置一个machineKey,所以我创建了一个密钥并将其放在我的应用程序的web.config中的machineKey标签中,瞧,它有效!
它在旧网站上工作的原因可能是它具有相当恒定的流量,并且可能没有足够长的空闲时间来重新生成机器密钥。但是,一旦我们在新网站上设置了机器密钥,它就能很好地运行:https://blogs.msdn.microsoft.com/amb/2012/07/31/easiest-way-to-generate-machinekey/