我在托管的MVC 4网站上遇到用户会话超时问题。当我使用IIS-Express在本地运行站点时,我有一个很长的超时时间。一旦网站发布到主机(GoDaddy),登录的超时时间就会下降到荒谬的时间(约10-15分钟)。
我正在使用表单身份验证。登录时我使用标准:
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
然后在我的控制器中,我使用Authorize
属性:
[Authorize]
public class BillingAccountController : Controller { ... }
我尝试过多个涉及更改web.config
设置的解决方案。此时,我在下面有一行来延长超时时间:
<configuration>
...
<system.web>
...
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" cookieless="UseCookies" />
</authentication>
...
<sessionState mode="InProc" cookieless="UseCookies" timeout="2880" />
...
</system.web>
...
</configuration>
但这不起作用。它似乎被主人忽略了。
我见过一些改变IIS7设置的解决方案,但由于这是托管我不认为我可以访问它。 (我查看了我的GoDaddy仪表板,虽然有一个IIS菜单,但它非常有限。)
该网站已上线约4个月,这是客户持续不断的投诉。
我正在使用自定义角色和成员资格提供程序,如果有帮助的话。我只使用Forms Auth来创建和授权auth cookie。此时,我可以对另一个登录解决方案开放。例如,如果必须放弃表单身份验证。
我可以想象一些解决方法,例如使用自定义属性创建自己的cookie,或者以某种方式扩展会话,或放弃cookie并使用数据库,搜索第三方解决方案的某种定期AJAX调用,等,....
客户希望我做一些事情 - 引用 - “从不”忘记。我不确定这是正确的答案。但是如果我能在一小时或两小时不活动之后至少让它超时,我认为他们会很高兴,因为10-15超时真的很烦人。
最重要的问题是:如何延长会话/登录超时,如果由于主机而无法解决问题,最好的方法是什么?
更新
在阅读了@DouglasThomas提供的资源后,我更新了web.config以改为使用SQLServer会话:
<sessionState mode="SQLServer" sqlConnectionString="ConnSessionState" sqlCommandTimeout="30" cookieless="false" timeout="1440" />
使用连接字符串:
<add name="ConnSessionState" connectionString="data source=1.1.1.1,1433;user id=userid;password=**************" providerName="System.Data.SqlClient" />
这似乎没有解决问题。用户登录仍然在不到20分钟的时间内完成。虽然,我确实有一个问题:SQLServer会话是否需要SQL数据库端的任何配置?或者只是web.config更改?我读过的文件不清楚。
更新2
根据@ DaveA的建议,我已经更新了我的解决方案。但它似乎仍然没有奏效。我已经使用asp会话状态数据库配置了我的SQL Server Express。我使用this Microsoft document作为指导,首先重新配置服务器设置(SQL Express的要求),然后使用以下命令行:
aspnet_regsql.exe -ssadd -sstype p -S SERVERPC\SQLEXPRESS -E
在ASPState
数据库中创建会话状态数据库。使用多个表和许多存储过程成功创建了新数据库。然后我更新了web.config中的sessionState
节点:
<sessionState
mode="SQLServer"
sqlConnectionString="data source=1.1.1.1,1433;user id=userid;password=**************"
allowCustomSqlDatabase="true"
sqlCommandTimeout="30"
cookieless="false"
timeout="1440"
/>
但它似乎对登录的持续时间没有任何影响。我无法判断它是否甚至连接到数据库,因为没有新记录填充ASPState DB中的表。我会注意到我没有在我的Web应用程序中的任何地方明确使用会话变量。我假设表单身份验证应该以某种方式使用它们。
解决方案
经过与@DaveA的共同努力,他在www.asp.net论坛上发现了一篇文章,其中有一个人遇到了同样的问题:http://forums.asp.net/t/1967093.aspx?Forms+authentication+session+timeout+issue+after+10+minutes
Per @ DaveA的建议我在我的web.config(which I generated from here)中添加了machineKey
部分。在实时网站上传和测试后,经过20多个小时的不活动后,用户登录仍然存在。所以我相信机器密钥就是我的答案。
答案 0 :(得分:4)
问题是:
您正尝试将定义的连接字符串与 SessionState Provider 一起使用。这是非常合乎逻辑的,但不起作用,因为 SessionState Provider 仍然使用 ASP.NET 1.0 ,而在 ASP.NET 2.0 中引入了连接字符串。
这是微软从未解决过的奇怪的不一致。
要设置DBSession状态:
1)在您定义 SessionState
时使用完整的连接字符串<sessionState mode="SQLServer"
sqlConnectionString="data source=1.1.1.1,1433;user id=userid;password=**************"
sqlCommandTimeout="30" cookieless="true" timeout="1440" />
非常重要:设置cookieless="true"
并在您的登录方式中确保rememberme=false
。这些步骤对于防止框架使用cookie进行会话状态非常重要。
2)在sql server上创建架构:
aspnet_regsql.exe -ssadd -d <Your Database>
-sstype c -S <Server> -U <Username> -P <Password>
3)在 web.config 中设置计算机密钥属性,将会话和成员资格绑定到主机:
Forms Authentication across virtual directories
http://aspnetresources.com/tools/machineKey
请记住:
使用数据库进行会话的性能成本很高,而且(正如您所注意到的那样)所有参数传递都功能繁琐。这远非完美的解决方案。
由于负载平衡,共享帐户通常会导致会话出现问题。在这种情况下,最好转向使用Cookie。您的更大问题似乎是GoDaddy出于安全原因共享主机策略限制会话超时(Cookie和会话)。
如果性能出现问题,您可能需要更改主机方案。
计算机密钥:旨在将成员资格绑定到域。当机器密钥匹配时,可以跨多个域共享成员资格。即使没有数据库会话,这可能会有所不同(值得一试)。
答案 1 :(得分:0)
您无法在共享托管环境中使用会话,因为它会影响该服务器上的其他网站。您可以使用ASP.NET会话状态作为替代,请参阅