如何在数据库中为托管的.NET MVC网站存储Sessionstate

我在托管的MVC 4网站上遇到用户会话超时问题。 当我使用IIS-Express在本地运行站点时,我有一个很长的超时时间。 一旦站点发布到主机(GoDaddy),登录的超时时间就会下降到荒谬的时间(约10-15分钟)。

我正在使用表单身份validation。 登录时我使用标准:

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

然后在我的控制器中我使用Authorize属性:

 [Authorize] public class BillingAccountController : Controller { ... } 

我尝试了几个涉及更改web.config设置的解决方案。 此时,我在下面有一行来延长超时:

  ...  ...    ...  ...  ...  

但这不起作用。 它似乎被主人忽略了。

我见过一些改变IIS7设置的解决方案,但由于这是托管我不认为我可以访问它。 (我查看了我的GoDaddy仪表板,虽然有一个IIS菜单,但它非常有限。)

该网站已经存在了大约4个月,这是客户持续不断的抱怨。

我正在使用自定义角色和成员资格提供程序,如果有帮助的话。 我只使用Forms Auth来创建和授权auth cookie。 此时,我可以对另一个登录解决方案开放。 如果必须放弃表单身份validation。

我可以想象一些解决方法,例如使用自定义属性创建我自己的cookie,或者以某种方式扩展会话,或放弃cookie并使用数据库,搜索第三方解决方案等的某种定期AJAX调用。 …

客户希望我做一些事情 – 引用 – “从不”忘记。 我不确定这是正确的答案。 但是如果我能在一小时或两小时不活动之后至少让它超时,我认为他们会很高兴,因为10-15超时真的很烦人。

最重要的问题是:如何延长会话/登录超时,如果由于主机而不能,最好的方法是什么?

UPDATE

在阅读了@DouglasThomas提供的资源后,我更新了web.config以使用SQLServer会话:

  

使用连接字符串:

  

这似乎没有解决问题。 用户登录仍然在不到20分钟的时间内完成。 虽然,我确实有一个问题:SQLServer会话是否需要SQL数据库端的任何配置? 或者只是web.config更改? 我读过的文件不清楚。

更新2

根据@ DaveA的建议,我已经更新了我的解决方案。 但它似乎仍然没有奏效。 我已经使用asp会话状态数据库配置了SQL Server Express。 我使用此Microsoft文档作为首先重新配置服务器设置(SQL Express的要求)的指南,然后我使用以下命令行:

 aspnet_regsql.exe -ssadd -sstype p -S SERVERPC\SQLEXPRESS -E 

ASPState数据库中创建会话状态数据库。 使用多个表和大量存储过程成功创建了新数据库。 然后我更新了web.config中的sessionState节点:

  

但它似乎没有对登录的持续时间产生任何影响。 我无法判断它是否甚至连接到数据库,因为没有新记录填充ASPState DB中的表。 我会注意到我没有在我的Web应用程序中的任何地方明确使用会话变量。 我假设表单身份validation应该以某种方式使用它们。

经过与@DaveA的一致努力,他在一个www.asp.net论坛上发现了一篇文章,其中有一个人有着同样的问题: http ://forums.asp.net/t/1967093.aspx?Forms+authentication+session +超时+问题+ + 10 +分钟后

根据@ DaveA的建议,我在我的web.config中添加了一个machineKey部分( 我从这里生成 )。 在实时网站上传和测试后,在超过20小时不活动后,用户登录仍然存在。 所以我相信机器密钥就是我的答案。

问题是:

您正在尝试将已定义的连接字符串与SessionState Provider一起使用 。 这是非常合乎逻辑的,但是不起作用,因为SessionState Provider仍然使用ASP.NET 1.0中的原始定义,而在ASP.NET 2.0中引入了Connection Strings。

这是微软从未解决过的奇怪的不一致。

为了设置DBSession状态:

1)定义SessionState时使用完整的连接字符串

  

非常重要:设置cookieless="true"并在登录方法中确保rememberme=false 。 这些步骤对于防止框架使用cookie进行会话状态非常重要。

2)在sql server上创建模式:

 aspnet_regsql.exe -ssadd -d  -sstype c -S  -U  -P  

3)web.config中设置Machine Key属性,将会话和成员资格绑定到主机:

表单跨虚拟目录的身份validation

http://aspnetresources.com/tools/machineKey


记住:

使用数据库进行会话的性能成本很高,而且(正如您所注意到的那样)所有参数传递都function繁琐。 这远非完美的解决方案。

由于负载平衡,共享帐户通常会导致会话出现问题。 在这种情况下,最好转向使用Cookie。 您的更大问题似乎是GoDaddy出于安全原因共享主机限制会话超时(Cookie和会话)的策略。

如果性能成为问题,您可能想要更改主机方案。


机器密钥:用于将成员资格绑定到域。 当机器密钥匹配时,可以跨多个域共享成员资格。 即使没有DB会话,这可能会有所不同(值得一试)。

您无法在共享托管环境中使用会话,因为它会影响该服务器上的其他站点。 您可以使用ASP.NET会话状态作为替代,请参阅