我正在使用Asp.Net MVC应用程序进行表单身份验证,如下所示:
代码
public void SignIn(string userName, bool isCookiePersistent)
{
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddDays(14),
createPersistentCookie, string.Empty);
HttpCookie authCookie = FormsAuthentication.GetAuthCookie(userName, isCookiePersistent);
if (authTicket.IsPersistent)
{
authCookie.Expires = authTicket.Expiration;
}
authCookie.Value = FormsAuthentication.Encrypt(authTicket);
HttpContext.Current.Response.Cookies.Add(authCookie);
}
public void SignOut()
{
FormsAuthentication.SignOut();
}
问题: 问题是,如果我将表单身份验证超时设置为4小时,我的用户仍然会在登录后半小时重定向到登录页面。
我已尝试在web.config中包含SessionSate
或执行SessionState
,但注意事项正在发生。问题仍然存在。这是我的web.cofig代码。
Web.config(没有sessionState元素)
<authentication mode="Forms">
<forms loginUrl="~/LogOn/LogOn" requireSSL="false" timeout="240" defaultUrl="~/Home/Home" name="__appcookie" path="/" slidingExpiration="true" ticketCompatibilityMode="Framework40" protection="All">
</forms>
</authentication>
Web.config(WITH sessionState element)
<sessionState timeout="240"></sessionState>
<authentication mode="Forms">
<forms loginUrl="~/LogOn/LogOn" requireSSL="false" timeout="240" defaultUrl="~/Home/Home" name="__appcookie" path="/" slidingExpiration="true" ticketCompatibilityMode="Framework40" protection="All">
</forms>
</authentication>
有人可以告诉我,在web.config中加入sessionState
和sessionTimeout
非常重要吗?我不能只在我的申请中使用formAuthentication
吗?
无论我使用sessionState
还是NOT,即使仅使用form authentication
,我的用户在登录应用程序后半小时后重定向到登录页面。 (但我已将240分钟设为form authentication timeout
)。
有人可以就此提出一些想法或解决方案。
提前致谢!
答案 0 :(得分:1)
forms ticketCompatibilityMode="Framework40"
指定票证到期日期存储为UTC。默认值为Framework20
,指定票证到期日期存储为本地时间。如果您在使用DateTime.Now
时手动设置FormsAuthenticationTicket到期日期,而您的ticketCompatibilityMode是Framework40,则您在本地和UTC(DateTime.Now
与DateTime.UtcNow
)之间断开连接。
这最近让我感到困惑。请参阅this MSDN article for more information。
答案 1 :(得分:0)
尝试在IIS中提升会话超时值。默认值为20分钟。您可以将web.config设置为在4年内使会话超时,但IIS会话超时将覆盖它。假设您的用户未在您的网站上有效...
答案 2 :(得分:0)
30分钟是表单身份验证cookie的默认时间,这让我相信您的配置有问题。您是否可以尝试简化配置以进行测试?
<authentication mode="Forms">
<forms loginUrl="~/LogOn/LogOn" timeout="240" protection="All" />
</authentication>