ASP.NET Core中Cookie身份验证过期太快

13

我有一个ASP.NET Core 1.1.2项目,其中我正在使用cookie身份验证。 我遇到一个问题,就是用户在闲置一个小时或更短的时间后被提示重新登录,并且失去了工作进度。下面的代码是我在Startup.cs的Configure函数中使用的,用于设置这个功能,从我所知道的来看,它应该至少在8个小时后过期。另外,ProjectProcessFlow只是项目的名称。

  app.UseCookieAuthentication(new CookieAuthenticationOptions()
  {
    AuthenticationScheme = "ProjectProcessFlow",
    LoginPath = new PathString("/Account/Login/"),       
    ExpireTimeSpan = new TimeSpan(8, 0, 0),
    SlidingExpiration = true,
    AutomaticAuthenticate = true,
    AutomaticChallenge = true
  });

我正在NuGet中包含 Microsoft.AspNetCore.Authentication.Cookies v1.1.2。为了让登录过期在预期时间内发生,我需要做什么?

附加信息:

我发现当超时发生并且用户被要求重新登录时,在服务器的事件查看器中记录了一个警告,指出它找不到项目下的日志文件夹。因此,我创建了该文件夹,并等待再次发生超时。当那时发生时,一个日志文件被创建在那个文件夹里,里面包含了这个:

Hosting environment: Production
Content root path: C:\inetpub\wwwroot\Sprout
Now listening on: http://localhost:13423
Application started. Press Ctrl+C to shut down.
当我重复这个过程时,发生了同样的事情,只是在“localhost:”之后出现了不同的数字。我应该提到的是,项目名称为ProjectProcessFlow,但URL以Sprout结尾。

这只是一个猜测,但可能与您是否启用了会话有关。通过 services.AddSession 启用了吗? - Hamid Mosalla
是的,在Startup.cs中同时调用了AddSession和UseSession。 - Rono
你的 web.config 文件中应该还有一个设置。 - Travis J
你能详细解释一下吗? - Rono
3个回答

13

我知道对于回答这个问题来说可能太晚了,但是对于那些面临此问题的人而言,IIS每20分钟重置一次池,并且ASP.NET每20分钟生成新的密钥来保护cookie值(身份验证和会话)。为了防止这种情况,请在 Startup 类的 ConfigureServices 中添加以下代码。


services.AddDataProtection()
                .PersistKeysToFileSystem(new System.IO.DirectoryInfo("SOME WHERE IN STORAGE"))
                //.ProtectKeysWithCertificate(new X509Certificate2());
                .SetDefaultKeyLifetime(TimeSpan.FromDays(90));

这里提供了完整的指南链接。它涵盖了 DataProtection 的所有内容。


1
ASP.Net Core 3.0 我倾向于同意,但我看到了这个问题。当身份验证 cookie 过期时,用户将被重定向到登录页面,并带有一个重定向 URL 返回到他们之前的位置。这可能是应用程序中需要特定会话值存在的地方。我曾经看到应用程序强制登录,然后成功地重定向到受会话保护的区域,并使用用户在被强制登录之前拥有的数据。如果会话和身份验证 cookie 以任何方式相关联,这将是不可能的。身份验证 cookie 被无效化而不会丢失会话,因此该 cookie 键不会更改。 - JRodd

8
用户在闲置一个小时或更短时间后被提示重新登录,并且失去了工作内容。
我有类似的配置,但我的正常工作。我能想到的一件事是不能让Web服务器闲置20分钟。IIS应用程序池默认空闲超时为20分钟 (我不能确定其他Linux Web服务器)。因此,您可以设置更长的应用程序池超时时间(0表示无限),或者每5分钟从外部服务(如Monitis)ping一次。 enter image description here

1
我没有按照你的建议进行设置,而是将闲置超时操作改为挂起,这样问题就解决了。由于你已经帮我完成了95%的工作,所以你将获得奖励。 - Rono
即使应用程序池回收,Cookie 仍存储在用户的本地计算机中。应用程序应检测到有效的 cookie,即使已经发生了无数次回收。 - Thanasis Ioannidis

0
你的ConfigureServices方法中是否设置了services.AddIdentity服务?
            services.AddIdentity<ApplicationUser, IdentityRole>(config =>
        {               
            //  Require a confirmed email in order to log in
            config.SignIn.RequireConfirmedEmail = true;
            // Cookie settings
            config.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromHours(10);
            config.Cookies.ApplicationCookie.LoginPath = "/Account/LogIn";
            config.Cookies.ApplicationCookie.LogoutPath = "/Account/LogOut";
        }).AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();

我曾遇到过类似的问题并在这里解决了它ASP.NET MVC Core Identity & Cookies


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接