IsAuthenticated 过期后保持真实

Posted

技术标签:

【中文标题】IsAuthenticated 过期后保持真实【英文标题】:IsAuthenticated stays true after expiry 【发布时间】:2020-04-25 00:19:30 【问题描述】:

有人要求我在新的一个月开始时强制重新授权用户(我们有每月订阅模式)。为了实现这一点并且不影响我们应用程序中使用的其他身份验证提供程序,我对登录调用进行了如下修改:

之前:

await HttpContext.SignInAsync(authorizationProvider.GetClaimsPrincipal());

之后:

await HttpContext.SignInAsync(authorizationProvider.GetClaimsPrincipal(), authorizationProvider.GetAutheticationProperties());

public AuthenticationProperties GetAutheticationProperties() =>
   new AuthenticationProperties
   
      ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(1),
      IsPersistent = true,
      AllowRefresh = false
   ;

请注意,出于测试目的,ExpiresUtc 将在未来设置为 1 分钟;一旦实施工作,它将计算到月底。

我预计我们的身份(扩展 ClaimsIdentity)会在达到 ExpiresUtc 后获得其属性 IsAuthorized false,但事实并非如此。阅读ClaimsIdentity.IsAuthenticated 声明

如果身份已通过身份验证,则为 true;否则为假。 备注:如果 AuthenticationType 属性不为 null 或为空字符串,则为 true。

现在我很困惑.. 到期后我应该期待什么?分别,身份如何变成IsAuthenticated == false

我们目前使用 asp.net core 2.2,并且正在迁移到 3。

在应用程序启动时正在像这样注册身份验证 (Startup.cs):

        var expirationInMinutes = Convert.ToInt32(Configuration["Authentication:ExpirationInMinutes"]);
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                // Configure cookie authentication
                .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>
                                                                              
                                                                                  o.LoginPath = new PathString("/Account/LogOn");
                                                                                  o.LogoutPath = new PathString("/Account/LogOut");
                                                                                  o.AccessDeniedPath = new PathString("/Account/AccessDenied");
                                                                                  o.SlidingExpiration = true;
                                                                                  o.ExpireTimeSpan = TimeSpan.FromMinutes(expirationInMinutes);
                                                                                  o.Cookie.Expiration = TimeSpan.FromMinutes(expirationInMinutes);
                                                                                  o.EventsType = typeof(CustomCookieAuthenticationEvents);

                                                                                  // Used because of safari
                                                                                  o.CookieManager = new ChunkingCookieManager()
                                                                                                    
                                                                                                        ChunkSize = 2048,
                                                                                                        ThrowForPartialCookies = true
                                                                                                    ;
                                                                              );

【问题讨论】:

【参考方案1】:

当用户通过身份验证时,就会发出一张票。为了节省数据库查询,该票证会每隔一段时间(默认为 20 分钟)重新验证。当 auth 票证过期时,直到票证重新验证后才会真正生效,因此如果您的验证间隔为 20 分钟,无论您将过期时间设置为什么,他们都将保持登录状态至少 20 分钟。

您可以将此间隔降低,如果您愿意,可以一直降低到零,这实际上意味着每次请求都会重新验证票证。但是,间隔越短,您的数据库必须处理的查询越多,因此需要权衡取舍。要更改间隔,只需添加:

services.Configure<SecurityStampValidatorOptions>(c =>

    c.ValidationInterval = TimeSpan.FromMinutes(1);
);

【讨论】:

哦,很高兴知道,谢谢!等待 20 分钟并没有让我退出。我是否期望在调用 _httpContext.User.Identities 时不会取回过期的身份? 如果用户已经真正退出,那么就没有HttpContext.User了。 你为什么说数据库查询?票证是否应该在没有分贝呼叫的情况下进行验证,是否过期? 也根据docs.microsoft.com/en-us/dotnet/api/…默认是30分钟【参考方案2】:

未按预期按时到期的另一个原因可能是ClockSkew。默认情况下,您的令牌将在 5 分钟内有效。

看 JWT Token authentication, expired tokens still working, .net core Web Api

【讨论】:

以上是关于IsAuthenticated 过期后保持真实的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 aws amplify 保持用户登录 react-native

登录后立即在 ActionFilter 中检查 User.Identity.IsAuthenticated

Tomcat 重启后 Apache Shiro isAuthenticated 返回 true

NodeJs Passport isAuthenticated() 即使在登录后也返回 false

如果在 User.Identity.IsAuthenticated 为 false 时提供两个条件,GetUser(string userName, bool isOnline) 是不是仍返回 nul

Firebase 令牌在 1 小时内过期后如何保留用户?