我有一个使用Forms Auth的网站。客户端不希望站点会话对用户完全过期。在登录页面代码隐藏中,使用以下代码:
// user passed validation
FormsAuthentication.Initialize();
// grab the user's roles out of the database
String strRole = AssignRoles(UserName.Text);
// creates forms auth ticket with expiration date of 100 years from now and make it persistent
FormsAuthenticationTicket fat = new FormsAuthenticationTicket(1,
UserName.Text, DateTime.Now,
DateTime.Now.AddYears(100), true, strRole,
FormsAuthentication.FormsCookiePath);
// create a cookie and throw the ticket in there, set expiration date to 100 years from now
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,
FormsAuthentication.Encrypt(fat)) { Expires = DateTime.Now.AddYears(100) };
// add the cookie to the response queue
Response.Cookies.Add(cookie);
Response.Redirect(FormsAuthentication.GetRedirectUrl(UserName.Text, false));
web.config文件auth部分如下所示:
<authentication mode="Forms">
<forms name="APLOnlineCompliance" loginUrl="~/Login.aspx" defaultUrl="~/Course/CourseViewer.aspx" />
</authentication>
当我登录网站时,see正确地将cookie发送到浏览器并传回:
HttpFox output http://cid-e79f8e4b07c3e30f.office.live.com/embedphoto.aspx/Public/SessionProblem.png
然而,当我走开20分钟左右时,回来尝试在网站上做任何事情,登录窗口再次出现。这个解决方案在我们的服务器上运行了一段时间 - 现在又回来了。在VS2008中运行Cassini的本地开发盒中不会出现此问题。
有关如何解决此问题的任何想法?
答案 0 :(得分:2)
会话超时和表单身份验证超时是两个不同的事情。会话超时是否设置为20分钟,是否会在Global.asax文件中的Session_End事件中将您的用户记录下来?
答案 1 :(得分:1)
默认情况下,IIS 6中的应用程序池设置为在不活动20分钟后关闭。如果您的应用配置中没有任何内容导致您的应用快速关闭,请检查IIS管理器中的应用池配置。你可以在那里设置许多精彩的旋钮。
答案 2 :(得分:0)
我在Global.asax中有以下内容:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
//Fires upon attempting to authenticate the use
if (!(HttpContext.Current.User == null))
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
if (HttpContext.Current.User.Identity.GetType() == typeof(FormsIdentity))
{
FormsIdentity fi = (FormsIdentity) HttpContext.Current.User.Identity;
FormsAuthenticationTicket fat = fi.Ticket;
String[] astrRoles = fat.UserData.Split('|');
HttpContext.Current.User = new GenericPrincipal(fi, astrRoles);
}
}
}
}
这就是你指的是什么?此外,如果这有任何区别,我们将处于IIS6环境中。
答案 3 :(得分:0)
另一个快速检查的可能是您的托管类型。云托管通常会有一个负载平衡器,硬盘设置为保持相同的IP指向节点服务器大约20分钟,但是在此之后,您可能会被推送到新服务器上,在新服务器上创建新会话并“记录您出'
如果你的标准共享主机或单个专用服务器或虚拟服务器,但这不是问题:)
要解决这个问题并保持asp.net会话正常工作,您需要将会话状态移动到数据库 - 或者重新设置代码以使用会话:)
答案 4 :(得分:0)
您可能想要检查是否使用负载均衡器。如果是这样,那么你真的不应该存储InProc。如果您有多个实体,应该查看状态服务器或SQL服务器。
根据这个问题,似乎没有遵守30分钟的默认值,这通常指向IIS /主机/网络配置。