如果你从VS2013开始应用aspnet身份的mvc5项目。您将在_LoginPartiaView.cshtml中找到以下代码:
@if (Request.IsAuthenticated )
{
using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
{
@Html.AntiForgeryToken()
@Html.ActionLink( "Hello " + User.Identity.GetUserName() , "profile", "Account", routeValues: null, htmlAttributes: new { title = "Manage" })
<a href="javascript:document.getElementById('logoutForm').submit()">Log off</a>
}
}
这意味着每次请求都会检查用户是否经过身份验证。如果可能的话,这将是美好的。
然而我的问题是在开发机器上进行测试,它运行正常。但是当在远程服务器[共享主机]上进行测试时,用户在空闲几秒钟后就会注销。
然后我搜索了这个SO - isAuthenticated result is false并且接受的答案说:
主机在几秒钟内杀死服务器中的AppPool 空闲。
并且有些评论说:
注意AppPool仍然会被不时地回收,所以 只有少数用户可能会这样做。
所以我认为session [mode:SqlServer]可以作为解决方案;代码将检查session["userName"]
而不是@if (Request.IsAuthenticated )
问题是: 使用会话存储用户名和验证操作可接受? 还有其他更好的概念适用于此吗?
修改: 回答布拉德Q;这是相关的web.config设置:
<authentication mode="Forms" >
<forms loginUrl="/Account/Login"
timeout="180"/>
</authentication>
<compilation debug="false" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<sessionState mode="SQLServer"
timeout="60"
allowCustomSqlDatabase="true"
sqlConnectionString="Data Source=xxxx.net;Initial Catalog=luckysessions;User ID=xxadmin;Password=xxxx;"
cookieless="false"/>
第二次编辑:
在阅读了这个问题here后,我开始重新思考并想添加这个问题: 它与Web场服务器设置有关吗?