【发布时间】:2021-05-13 04:51:53
【问题描述】:
我在 SO 上找到的大多数问题都有相反的问题 - 即会话没有滑动。我的问题是它似乎永远不会停止。
如果我将窗口设为绝对窗口 (SlidingExpiration = false),我能够自动注销过期会话的唯一方法。
我正在使用 IdentityServer 4 和 ASP.NET Identity 作为后备用户存储。
我目前拥有的cookie的配置是:
services.AddIdentity<IdpUser, IdentityRole<int>>()
.AddEntityFrameworkStores<IdpDbContext>()
.AddDefaultTokenProviders();
// Note ASP.NET identity uses a cookie called "Identity.Application"
services.ConfigureApplicationCookie(options =>
{
options.ExpireTimeSpan = TimeSpan.FromMinutes(15); // for testing purposes
options.SlidingExpiration = true;
});
我们的客户端是一个 Vuejs 应用,使用 oidc-client.js 来管理令牌。
我已将客户端配置中的所有生命周期缩短到 300 秒(包括访问令牌)。因此,它每 300 秒获得一个新的 access_token。
我预计如果我登录后离开超过 15 分钟然后回来,我会被注销。但这种情况并非如此。它不断获得新的令牌。
即使我刷新整个页面,我仍然没有退出。
经过进一步调查,我相信oidc-client.js 所做的持续轮询正在扩展身份验证cookie 的滑动窗口。这是一个基于观察到的行为的理论。我增加了 access_token 生命周期的持续时间,使其比身份验证 cookie 更长。在这种情况下,用户在 auth cookie 过期后被注销。大概是因为客户端在那个时候没有请求另一个 access_token(从而延长了窗口)。
所以滑动窗口似乎会一直滑动直到达到SlidingRefreshTokenLifetime,默认为15天左右。
将SlidingRefreshTokenLifetime 减少到大约 3 小时可能是我的答案吗?
谢谢
【问题讨论】:
-
可能不相关,但您应该始终为 cookie 设置一个特定于应用程序的名称(我认为是 options.Cookie.Name),这样您就不会拥有多个具有相同默认名称的不相关 cookie(Identity.Application )。
标签: asp.net-identity identityserver4