我有一个使用表单身份验证的Asp Mvc 2站点。当我在本地运行它时,我可以登录并无限期地保持登录状态。
然而,当我把它放在服务器上时,我似乎只能保持登录状态几分钟然后似乎已经注销了。我看过这些饼干,其中有两个看似相关:
.ASPXAUTH是一个会话cookie .ASPXANONYMOUS将于3个月后到期。
当我刷新页面时,cookie保持不变,直到我退出,当我似乎得到一个新的.ASPXANONYMOUS cookie,但.ASPXAUTH似乎是相同的。
似乎我可以保持登录状态,直到我在一段时间后做某事。如果我在登录后立即提交表单,那么它可以正常工作,但如果我一次又一次地提交数据,那么在一分钟左右之后,其中一个提交将作为已注销用户而不是用户已登录,所有其他提交的工作都是。
可能导致此行为的原因以及如何追踪不同的行为?改变它,以便我可以无限期地保持登录状态?
修改,
它是一个单一的服务器,但经过一些调查和搜索后,可能的候选人似乎是我在服务器上使用超过100mb并且应用程序池正在被回收。我想现在我需要知道
答案 0 :(得分:12)
可能是ASP.NET应用程序正在重新循环或关闭(例如由于空闲超时或新建/更改的程序集)?
当ASP.NET Web应用程序启动时,默认情况下会为视图状态和会话cookie生成加密密钥。这将使最初从应用程序的早期运行(或来自不同系统)提供的任何此类数据无效。
要让会话在ASP.NET应用程序周期(以及多服务器场)中运行,您可以在web.config
中指定密钥:
<system.web>
...
<machineKey
decryption="AES"
validation="SHA1"
decryptionKey="..."
validationKey="..."
/>
其中decryptionKey
和validationKey
是长度为十六进制的字符串,具体取决于算法(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)
下的值。我将其设置为与其他应用程序池所使用的值相同。
此更改解决了该问题,原来是在使用过期的SSL证书进行一些误导的故障排除时,将其设置为较低的值。
答案 4 :(得分:0)
如果这些都不起作用,请检查应用程序池并确保将空闲超时设置为20+分钟。单击应用程序池,选择右侧的Advanced Settings
链接,找到Process Model
部分,然后在那里增加Idle Timeout
值。