3

我正在实现“记住我”功能,我希望用户不必再次输入登录名/密码。

它似乎在本地工作,但在共享主机中,它持续大约 15 分钟然后注销。这是代码:

控制器

FormsAuthentication.SetAuthCookie("username", true);

网络配置

<authentication mode="Forms" >
    <forms loginUrl="~/Account/LogOn" timeout="262974" cookieless="UseCookies" />
</authentication>
<sessionState mode="InProc" timeout="262974" cookieless="UseCookies" />

编辑

我已经添加了 sessionState,但仍然是同样的问题,在本地而不是在服务器上工作?

我错过了什么?

4

3 回答 3

4

查看 web.config 中的sessionstate元素。例如:

<sessionState mode="InProc" timeout="60" />

查看以下 SO 问题,了解web.config 中sessionstate元素和forms元素之间的差异: 表单身份验证超时和会话超时的差异

@womp接受的答案如下:

每次新用户访问该网站时都会开始一个会话,无论他们是否匿名。身份验证与 Session 关系不大。

身份验证超时是身份验证 cookie 在用户浏览器上的有效时间。一旦 cookie 过期,他们必须重新进行身份验证才能访问站点上的受保护资源。

因此,如果 Session 在 Authentication cookie 之前超时 - 它们仍然经过身份验证,但它们的所有会话变量都会消失,并且如果您在检查空值和其他因缺少会话而带来的情况时不遵守纪律,可能会导致您的网站出现错误。

如果 Authentication 在会话之前超时,那么他们的所有会话变量仍然存在,但他们将无法访问受保护的资源,直到他们再次登录。

于 2012-06-06T13:52:54.440 回答
3

我终于找到了解决方案,我不得不使用StateServer而不是InProc机器密钥,这是完整的解决方案:

控制器:

FormsAuthentication.SetAuthCookie("username", true);

网络配置:

<authentication mode="Forms" >
    <forms loginUrl="~/Account/LogOn" timeout="262974" cookieless="UseCookies" />
</authentication>

<sessionState mode="StateServer" timeout="262974" cookieless="UseCookies" />

<machineKey validationKey="5BAE63F50C69C1BBB7BFC2E696674389C307E28E9DEB60FB273B85CAD8FC3C2261FB13DF92B90A99C6EB684FDB1F6E3E92E1A42083EB77B5918126DD52245FB5" decryptionKey="11F6FE0C790413FFF3E230387168016B212216DEF727C4157CDDD0558BEAE5B7" validation="SHA1" decryption="AES" />

我与Arvixe有一个共享主机,在他们的支持中我找到了解决方案:support.arvixe.com

于 2012-06-06T21:08:22.210 回答
0

转到:ASP.NET 设置并滚动到会话设置将“值”无更改为“表单”它会完成! 转到身份验证模式

于 2016-07-22T07:31:18.483 回答