为什么我的用户会在一分钟左右后退出?

时间:2011-01-02 13:01:46

标签: asp.net cookies forms-authentication

我有一个使用表单身份验证的Asp Mvc 2站点。当我在本地运行它时,我可以登录并无限期地保持登录状态。

然而,当我把它放在服务器上时,我似乎只能保持登录状态几分钟然后似乎已经注销了。我看过这些饼干,其中有两个看似相关:

.ASPXAUTH是一个会话cookie .ASPXANONYMOUS将于3个月后到期。

当我刷新页面时,cookie保持不变,直到我退出,当我似乎得到一个新的.ASPXANONYMOUS cookie,但.ASPXAUTH似乎是相同的。

似乎我可以保持登录状态,直到我在一段时间后做某事。如果我在登录后立即提交表单,那么它可以正常工作,但如果我一次又一次地提交数据,那么在一分钟左右之后,其中一个提交将作为已注销用户而不是用户已登录,所有其他提交的工作都是。

可能导致此行为的原因以及如何追踪不同的行为?改变它,以便我可以无限期地保持登录状态?

修改

它是一个单一的服务器,但经过一些调查和搜索后,可能的候选人似乎是我在服务器上使用超过100mb并且应用程序池正在被回收。我想现在我需要知道

  • 如何查看我正在使用的内存量。
  • 有什么建议可以减少这种情况。

5 个答案:

答案 0 :(得分:12)

可能是ASP.NET应用程序正在重新循环或关闭(例如由于空闲超时或新建/更改的程序集)?

当ASP.NET Web应用程序启动时,默认情况下会为视图状态和会话cookie生成加密密钥。这将使最初从应用程序的早期运行(或来自不同系统)提供的任何此类数据无效。

要让会话在ASP.NET应用程序周期(以及多服务器场)中运行,您可以在web.config中指定密钥:

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

其中decryptionKeyvalidationKey是长度为十六进制的字符串,具体取决于算法(AES:64位和SHA1:128,其他算法检查MSDN)。

这些密钥应该以加密方式生成,.NET具有可以在PowerShell中使用的类型:

$rng = New-Object "System.Security.Cryptography.RNGCryptoServiceProvider"
$bytes = [Array]::CreateInstance([byte], 16)
$rng.GetBytes($bytes)
$bytes | ForEach-Object -begin { $s = "" } -process { $s = $s + ("{0:X2}" -f $_) } -end { $s}

对于AES,使用上面的数组长度,对于SHA1,使用64的长度。

答案 1 :(得分:1)

Web服务器上的会话超时很可能配置为比您在web.config中的表单身份验证配置中设置的时间跨度小得多。

IIS6和IIS7的默认会话超时为20分钟。

如果您可以访问Web服务器的管理界面,可以通过GUI提高超时,但如果IIS7使用<sessionState><sessionPageState>部分,也可以从配置文件设置:

http://msdn.microsoft.com/en-us/library/cc725820(v=ws.10).aspx

答案 2 :(得分:1)

检查webconfig身份验证部分

<authentication mode="Forms">
   <forms name="UniqueName" loginUrl="login.aspx" path="/"  >
    </forms>
</authentication>

确保每个托管网站的身份验证Cookie名称都是唯一的。

答案 3 :(得分:1)

按照@Richard的建议来到这里,遇到类似的问题,我查看了应用程序池的回收设置。我发现更改设置并将Regular time intervals (in minutes)值设置为1分钟。这意味着应用程序池每分钟都会被回收一次。

要更改此设置,请右键单击应用程序池,选择Recycling选项,然后更改Regular time intervals (in minutes)下的值。我将其设置为与其他应用程序池所使用的值相同。

Which setting to change

此更改解决了该问题,原来是在使用过期的SSL证书进行一些误导的故障排除时,将其设置为较低的值。

答案 4 :(得分:0)

如果这些都不起作用,请检查应用程序池并确保将空闲超时设置为20+​​分钟。单击应用程序池,选择右侧的Advanced Settings链接,找到Process Model部分,然后在那里增加Idle Timeout值。