如何在ASP.NET Core网站中通过AWS Cognito实现15分钟闲置超时登出?
ASP.NET Core + AWS Cognito 实现15分钟无交互自动登出的问题
我在ASP.NET Core网站中使用AWS Cognito进行用户认证,注册、登录、登出功能均正常运行,但希望实现用户15分钟无交互时自动登出。
目前已通过设置网站Cookie过期时间,实现了15分钟后用户从网站登出,但用户会立即跳转至Cognito,无需验证凭据便自动重新登录并返回网站,相当于并未真正登出。相关代码如下:
services.AddAuthentication(options => { options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie(options => { options.ExpireTimeSpan = TimeSpan.FromMinutes(1); // 后续会重置为15 options.SlidingExpiration = true; options.Cookie.HttpOnly = true; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.Cookie.SameSite = SameSiteMode.Lax; }) .AddOpenIdConnect(options => { options.NonceCookie.SameSite = SameSiteMode.Lax; options.CorrelationCookie.SameSite = SameSiteMode.Lax; options.ResponseType = OpenIdConnectResponseType.Code; ...
我打算尝试将Cognito刷新令牌的过期时间设置为最小值1小时,但这仍比我需要的15分钟长得多(设置access token和id token过期时间为5分钟无效,因为它们会自动刷新)。
目前想到两个方案:
- 方案1:在Web应用中设置计时器,用户有交互时重置计时器;若计时器归0,则调用Cognito API撤销刷新令牌或执行全局登出(此Cognito用户池仅用于该单一应用,全局登出不会引发问题)。但该方案繁琐且容易出错。
- 方案2:用户每次请求页面时,检查其上次访问页面的时间间隔,若超过15分钟则重定向至Cognito登出页面。但该方案可能会被有意图的攻击者绕过,因为它需要浏览器跳转至Cognito网站才能完成登出。
是否存在更简便的第三种方法?
补充信息:
根据GlobalSignOut文档描述,即使实现了GlobalSignOut或撤销刷新令牌,用户仍可在长达1小时内自动重新登录:
Signs out users from all devices. It also invalidates all refresh tokens that Amazon Cognito has issued to a user. A user can still use a hosted UI cookie to retrieve new tokens for the duration of the 1-hour cookie validity period.
另有用户尝试方案1后发现,Cognito的托管UI Cookie确实会在1小时内让用户自动重新登录。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

