cookie过期或会话超时太快

问题描述:

我有这样的代码,当用户被授权可以在运行:cookie过期或会话超时太快

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
       1, 
       email, 
       DateTime.Now, 
       DateTime.Now.AddMinutes(120), 
       true, 
       userData); 

     string encTicket = FormsAuthentication.Encrypt(authTicket); 
     HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 
     faCookie.Expires = authTicket.Expiration; 
     Response.Cookies.Add(faCookie); 

我然后重定向到一个控制器/动作具有Authrize属性:

[Authorize] 
    public class ProductsController : Controller 
    { 

我已在web.config中如下:

<authentication mode="Forms"> 
     <forms loginUrl="~/Home/Unauthorized" timeout="2880" /> 
    </authentication> 
    <sessionState timeout="120"></sessionState> 

但是用户抱怨会话超时或再在几分钟不活动之后指导家庭/未经授权。

什么可能导致这种情况,我应该检查什么?

+0

我不明白为什么人们获取与窗体身份验证Cookie超时和服务器会话timeout..they困惑是2个不同的thinngs ...伴侣你说你的服务器 – Shaz 2014-10-13 10:57:36

+0

到期用户时间120分钟,并在另一方面告诉浏览器cookie持有2280的身份验证票证...显然,票据在120后过期并且用户超时...而用户仍然持有以前的身份验证票证。 – Shaz 2014-10-13 10:58:42

+0

您是否明确定义了您的网络中的MachineKey?配置? – Tommy 2014-10-13 16:46:38

在我进入可能的解决方案之前,有一些想法可以解释为什么您的登录过期。首先,FormsAuthentication cookie和SessionState完全是两个不同的东西。你可以有一个或另一个,或者两者兼得,或者都不兼容。结果,这两个项目的超时也没有关系。

FormsAuthentication cookie是一个加密的cookie,它包含一些基本信息,如用户名和过期值。 .NET应用程序在用户进行身份验证后使用此cookie来了解用户是否获得了某些资源的授权。

什么控制FormsAuthentication cookie的加密和解密是MachineKey IIS上该Web应用程序。 MachineKey是一组用于加密和解密cookie的密钥。默认情况下,IIS上的Web应用程序被设置为AutoGenerate机器密钥。这意味着当应用程序启动时,会生成随机机器密钥。如果应用程序回收,您会得到一个新的机器密钥。此外,如果您在共享提供程序上托管,则Web主机通常会使您的应用程序负载平衡,即由多台服务器托管。每台服务器都会自动生成机器密钥。

如果您的Web应用程序处于负载平衡方案中,则Web场中的每台计算机都无法解密其他加密的Cookie。这将会显示“正在注销”。其中的例子是登录到Web服务器A上,然后后续请求转到Web服务器B.Web服务器B不与Web服务器A共享计算机密钥,并且无法解密该Cookie,从而将用户发送回登录页面。

的解决方案是定义在web.config中的machineKey部分,因此IIS的每个实例都将使用相同的密钥,以及如果应用程序池回收,你仍然有相同的计算机密钥。

这里将是一个example machine key,你可以在你的web.config放置

<system.web> 
    <machineKey validationKey="EBC1EF196CAC273717C9C96D69D8EF314793FCE2DBB98B261D0C7677C8C7760A3483DDE3B631BC42F7B98B4B13EFB17B97A122056862A92B4E7581F15F4B3551" 
    decryptionKey="5740E6E6A968C76C82BB465275E8C6C9CE08E698CE59A60B0BEB2AA2DA1B9AB3" 
    validation="SHA1" decryption="AES" /> 
</system.web> 

其他的想法是,你在你的web.config(2880),哪些过期你实际上是设置届满时( 120)不匹配。你可能希望他们都匹配。

+1

很好的解释 – 2015-11-18 06:49:10

如果您在负载平衡器后面运行,你会想,以确保Web场使用由汤米的回答指出了一个一致的关键。

其他要检查的事情是IIS元数据库为每个服务器设置是相同的。他们需要有相同的路径和ID。

你也想看看暂停会议(你的网站。配置看起来像proc),这是易受网络中断和随机应用程序回收。

基本上是这个链接的摘要。 http://msdn.microsoft.com/en-us/library/vstudio/ms178586(v=vs.100).aspx

如果您可以发布更多配置(如果可能)并提供有关您的环境设置的更多详细信息,则可以更轻松地将您指向更集中的方向。

试试这个:

的web.config代码:

<system.web> 
     <httpRuntime maxRequestLength="40000000" useFullyQualifiedRedirectUrl="true" executionTimeout="600000" /> 
     <authentication mode="Forms"> 
       <forms loginUrl="~/Home/Unauthorized" timeout="2880" cookieless="UseCookies" /> 
      </authentication>  
    </system.web> 

这将帮助你。