【问题标题】:Cookie Authentication expiring too soon in ASP.NET CoreASP.NET Core 中的 Cookie 身份验证过早过期
【发布时间】:2017-08-09 16:02:58
【问题描述】:

我有一个使用 cookie 身份验证的 ASP.NET Core 1.1.2 项目。我遇到一个问题,用户在闲置一小时或更短时间后被提示重新登录,并且失去工作。下面的代码是我在 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?
  • 是的,在 Startup.cs 中同时调用了 AddSession 和 UseSession
  • 你的 web.config 文件中也应该有一个设置。
  • 你能详细说明一下吗?

标签: c# authentication asp.net-core-mvc


【解决方案1】:

我知道现在回答这个问题为时已晚,但对于谁来说。 IIS 重置池每 20 分钟和每 20 分钟 ASP.NET 生成新的密钥以保护 cookie 值(身份验证和会话)。为防止这种情况,请将以下代码添加到 Startup 类中的 ConfigureServices

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

完整的指南是here。都是关于DataProtection

【讨论】:

  • ASP.Net Core 3.0 我倾向于同意,但我看到了这个问题。当 auth cookie 过期时,用户将被重定向到使用重定向 URL 登录到他们原来的位置。这可以是应用程序中需要存在特定会话值的地方。我已经看到该应用程序强制登录,然后使用用户在强制登录之前拥有的数据成功重定向到会话保护区。如果会话和身份验证 cookie 无论如何都链接,这是不可能的。 auth cookie 正在失效而不会丢失会话,因此 cookie 密钥不会更改。
【解决方案2】:

用户在闲置一小时后被提示重新登录 或更少,并失去工作。

我有类似的configuration,但它对我来说很好用。

我能想到的一件事是你不能让网络服务器闲置 20 分钟。 IIS 的应用程序池默认空闲超时时间为 20 分钟 (对于其他 Linux 网络服务器我不能说)。

因此您可以设置更长的应用程序池超时(0 表示无穷大),或者从外部服务(如 Monitis)每 5 分钟 ping 一次。

【讨论】:

  • 我没有设置执行您的建议之一,而是将空闲超时操作更改为暂停,这为我解决了问题。既然你让我走了 95% 的路,你就得到了赏金。
  • 即使应用程序池回收,cookie 也会存储在用户的本地计算机中。即使回收发生了无数次,应用程序也应该检测到有效的 cookie。
【解决方案3】:

您的 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

【讨论】:

    猜你喜欢
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2017-03-30
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多