gpt4 book ai didi

c# - 如何将 Sessionstate 存储在托管 .NET MVC 网站的数据库中

转载 作者:太空宇宙 更新时间:2023-11-03 21:33:03 24 4
gpt4 key购买 nike

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

我正在使用表单例份验证。登录时我使用标准:

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

然后在我的 Controller 中我使用 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,或者以某种方式扩展 session 的某种定期 AJAX 调用,或者放弃 cookie 并使用数据库,搜索第三方解决方案等。 ...

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

底线问题是:如何延长 session /登录超时时间,如果因为主机而无法延长,最好的解决方法是什么?

更新

在阅读了@DouglasThomas 在他的回答中提供的资源后,我更新了 web.config 以使用 SQLServer session :
<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 session 是否需要在 SQL 数据库端进行任何配置?还是只是 web.config 更改?我阅读的文件不清楚。

更新 2

根据@DaveA 的建议,我更新了我的解决方案。但它似乎仍然没有工作。我已经使用 asp session 状态数据库配置了我的 SQL Server Express。我用了 this Microsoft document作为首先重新配置服务器设置的指南(SQL Express 的要求),然后我使用了以下命令行:
aspnet_regsql.exe -ssadd -sstype p -S SERVERPC\SQLEXPRESS -E

ASPState 中创建 session 状态数据库数据库。使用多个表和大量存储过程成功创建了新数据库。然后我更新了 sessionState web.config 中的节点如下:
<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 应用程序的任何地方明确使用 session 变量。我假设表单例份验证应该以某种方式使用它们。

解决方案

经过与@DaveA 的共同努力,他在 www.asp.net 论坛上发现了一篇文章,其中有人遇到了几乎相同的问题: http://forums.asp.net/t/1967093.aspx?Forms+authentication+session+timeout+issue+after+10+minutes

根据@DaveA 的建议,我添加了 machineKey部分到我的 web.config ( which I generated from here )。在现场网站上上传和测试后,在 20 多个小时不活动后,用户登录仍然存在。所以我相信机器 key 是我的答案。

最佳答案

问题是:

您正在尝试将定义的连接字符串与 一起使用。 session 状态提供者 .这是非常合乎逻辑的,但不起作用,因为 session 状态提供者 仍然使用 中的原始定义ASP.NET 1.0 , 而连接字符串是在 中引入的ASP.NET 2.0 .

这是 Microsoft 从 Unresolved 奇怪的不一致问题。

为了设置 DBSession 状态:

1) 定义 时使用完整的连接字符串 session 状态

<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 用于 session 状态非常重要。

2) 在您的 sql server 上创建架构:
aspnet_regsql.exe -ssadd -d <Your Database> 
-sstype c -S <Server> -U <Username> -P <Password>

3) 在您中设置机器 key 属性 web.config 将您的 session 和成员资格绑定(bind)到您的主机:

Forms Authentication across virtual directories

http://aspnetresources.com/tools/machineKey

请记住:

使用数据库进行 session 的性能代价高昂,并且(正如您已经注意到的)所有参数传递在功能上都很乏味。这远非完美的解决方案。

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

如果性能成为问题,您可能需要更改托管计划。

机器 key :旨在将成员资格绑定(bind)到域。当机器 key 匹配时,成员资格可以在多个域之间共享。即使没有数据库 session ,这也可能会有所作为(值得一试)。

关于c# - 如何将 Sessionstate 存储在托管 .NET MVC 网站的数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com