表单身份验证slidingExpiration不起作用

时间:2018-03-13 10:59:09

标签: c# asp.net-mvc cookies form-authentication slidingexpiration

我有以下代码

int intTimeout = (FormsAuthentication.Timeout.Hours * 60) +
  FormsAuthentication.Timeout.Minutes;
var authTicket = new FormsAuthenticationTicket(1, Utility.userCookie, DateTime.Now, 
  DateTime.Now.AddMinutes(intTimeout), true, cookieValue);

string strEncryptedTicket = HttpUtility.UrlEncode(FormsAuthentication.Encrypt(authTicket));
var authCookie = new HttpCookie(Utility.userCookie, strEncryptedTicket);
authCookie.Expires = authTicket.Expiration;
//FormsAuthentication.RedirectFromLoginPage("", false);
authCookie.Secure = FormsAuthentication.RequireSSL;
//authCookie.Secure = true;

HttpContext.Current.Response.Cookies[Utility.userCookie].Expires = authTicket.Expiration;
HttpContext.Current.Response.Cookies[Utility.userCookie].Value = authCookie.Value;

web.config

下面
<authentication mode="Forms">
  <forms timeout="2" slidingExpiration="true" requireSSL="true" />
</authentication>

我一直打到页面链接,仍然会在2分钟后过期

5 个答案:

答案 0 :(得分:1)

请注意 web.config 自定义基于表单的身份验证的结构:

<forms 
   name="name" 
   loginUrl="URL" 
   defaultUrl="URL"
   protection="[All|None|Encryption|Validation]"
   timeout="[MM]"
   path="path"
   requireSSL="[true|false]"
   slidingExpiration="[true|false]">
   enableCrossAppRedirects="[true|false]"
   cookieless="[UseUri|UseCookies|AutoDetect|UseDeviceProfile]" 
   domain="domain name"
   ticketCompatibilityMode="[Framework20|Framework40]">
   <credentials>...</credentials>
</forms>

如您所见,timeout属性的工作基于您将其设置为2的分钟数(例如2分钟)。

通常,如果您在 web.config 中启用slidingExpiration您无需手动重新生成新Cookie 。对于您的方案,我建议您使用跟踪工具,例如提琴手。刷新页面时,您可以从Fiddler查看是否重置了Cookie过期时间。

我在Weird Timeouts With Custom ASPNETFormsAuthentication找到了一个很好的例子,可以为你做一些许可。

答案 1 :(得分:1)

尝试从代码中删除此行,然后重试:

HttpContext.Current.Response.Cookies[Utility.userCookie].Expires = authTicket.Expiration;

答案 2 :(得分:1)

在web.config文件中,删除<clear/>元素或在<clear/>元素之后添加以下内容(如果不存在)。

<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>

答案 3 :(得分:1)

该问题可能与web.config文件中缺少静态machineKey部分有关。当您调用FormsAuthentication.EncryptFormsAuthentication.Decrypt时,这些方法使用web.config文件中提供的machineKey值来执行操作。如果不为machineKey提供严格的值,则将在Web应用程序的起点生成新的唯一validationKeydecryptionKey。有时取决于服务器设置(例如,应用程序池设置的空闲时间较小),应用程序在FormsAuthenticationTicket的到期时间之前终止。在这种情况下,由于新的machineKey值,解密方法无法验证票证。我只建议您设置一个静态的machineKey。

请参阅以下链接: https://msdn.microsoft.com/en-us/library/w8h3skw9(v=vs.100).aspx

答案 4 :(得分:0)

在我的应用程序中,我在cookieAuthenticationOptions中定义了Startup.cs,这样就可以了。

app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                ExpireTimeSpan = TimeSpan.FromHours(1),
                SlidingExpiration = true,
                CookieHttpOnly = true,
                CookieName = "App.Authentication",
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login"),
            });

您是否定义了这些选项?

为什么你不使用SignIn的{​​{1}}方法?