【发布时间】:2016-10-14 18:57:59
【问题描述】:
我正在开发一个应用程序 (ASP.NET MVC 5),我想在该应用程序中防止特定页面上的 auth cookie 过期(这是一个巨大的表格,需要一些时间才能完全填写)。我所拥有的是:
Startup.cs
中的 ASP.NET 身份配置app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, Guid>(
validateInterval: TimeSpan.FromMinutes(15),
regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
getUserIdCallback: (id) => Guid.Parse(id.GetUserId()))
},
SlidingExpiration = true,
ExpireTimeSpan = TimeSpan.FromMinutes(30)
});
SignIn 控制器中的方法实现
AuthenticationManager.SignIn(new AuthenticationProperties()
{
AllowRefresh = true,
IsPersistent = isPersistent,
ExpiresUtc = TimeSpan.FromMinutes(30)
}, identity);
jQuery 方法在特定页面上实现,每 10 分钟向服务器发布一次。
(function ($) {
function keepSessionAlive() {
$.post("/Resources/KeepSessionAlive");
}
// 10 minutes
setInterval(keepSessionAlive, 60 * 1000 * 10);
})(jQuery);
KeepSessionAlive 在控制器中的实现
//
// POST: /Resources/KeepSessionAlive/
[HttpPost]
public JsonResult KeepSessionAlive()
{
if (HttpContext.Session != null)
HttpContext.Session["KeepSessionAlive"] = DateTime.Now;
return Json($"Last refresh {DateTime.Now.ToString("O")}");
}
问题: 当我导航到特定页面时,我可以看到以下发帖请求:
- /Resources/KeepSessionAlive - 200 OK
- /Resources/KeepSessionAlive - 200 OK
- /Resources/KeepSessionAlive - 401 未授权
但 30 分钟后,我得到了未经授权的 401。我做错了什么?
顺便说一句。 CookieAuthenticationOptions.ExpireTimeSpan 和 AuthenticationProperties.ExpiresUtc 有什么区别。应该一样吧?如果我将它们设置为不同的值,它的行为如何?感谢您的澄清。
// 编辑:
我发现cookie在等于validateInterval: TimeSpan.FromMinutes(15)的15分钟后过期,但我认为它不会影响cookie过期,因为this is a security feature which is used when you change a password or add an external login to your account。
【问题讨论】:
标签: jquery asp.net asp.net-mvc cookies asp.net-identity