【问题标题】:ASP.NET Core MVC 3.1 Logs out after a short timeASP.NET Core MVC 3.1 在短时间内注销
【发布时间】:2020-08-25 14:02:02
【问题描述】:

在我解释我面临的问题之前,我需要强调一下,这个问题不会发生在我的本地计算机上。只有在我将应用程序部署到 AWS(Windows Server + IIS)时才会发生这种情况。

应用程序有许多具有 [Authorize] 属性的 Web API 端点。该应用程序使用 Cookie 身份验证。 你可以在这里看到这个网站:https://saveonclouds.com

在 Startup.cs 中,我保存了 cookie 并为其指定了一个自定义名称“saveoncloudscookie”。

但是在登录(通过用户名/密码和 Google)大约 10 分钟后,用户退出并看到登录页面!

由于问题仅发生在托管环境中,因此解释部署可能对我有用:

浏览器 --> CloudFlare (SSL/TLS) --> 负载均衡器 (AWS) --> EC2(只有一个实例)

在上述部署模型中,SSL 证书在负载均衡器上终止,因此 AWS EC2 通过 HTTP 而不是 HTTPS 接收流量。

我使用下面的代码来尝试保存 auth cookie,但它似乎不起作用:

对于谷歌登录:

services.AddAuthentication().AddGoogle(options => { options.ClientId = AppSettings.Authentication.Google.ClientId; options.ClientSecret = AppSettings.Authentication.Google.ClientSecret; options.AccessDeniedPath = "/Accounts/AccessDenied"; options.CorrelationCookie.Expiration = new TimeSpan(1,0,0,0); options.SaveTokens = true;

                options.Events = new OAuthEvents
                {
                    OnAccessDenied = loginFailureHandler =>
                    {
                        loginFailureHandler.Response.Redirect("/Accounts/Signin");
                        loginFailureHandler.HandleResponse();
                        return Task.FromResult(0);
                    },
                    OnTicketReceived = ticket =>
                    {
                        ticket.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddDays(1);
                        ticket.Properties.IsPersistent = true;
                        ticket.Options.SaveTokens = true;
                        return Task.FromResult(0);
                    }
                };
            })

services.ConfigureApplicationCookie(option =>
            {
                option.Cookie.Name = "saveoncloudscookie";
                option.Cookie.HttpOnly = true;
                option.Cookie.SameSite = SameSiteMode.None;
                option.Cookie.MaxAge = new TimeSpan(1,0,0,0);
                option.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;

                option.LoginPath = "/Accounts/Signin";
                option.AccessDeniedPath = "/Accounts/AccessDenied";
                option.ExpireTimeSpan = TimeSpan.FromHours(authConfig.CookieExpirationHours);
                option.SlidingExpiration = true;

            });

我对此进行了计时,似乎在四分钟后用户就会退出!

我错过了什么吗?

【问题讨论】:

  • 我似乎无法重现该问题。我已登录应用程序,访问了几个页面,但即使 5 分钟后我也没有收到任何 401 错误
  • 我刚刚测试了它,它发生了。只需使用 Chrome 登录该网站并离开该网站大约 10 分钟,然后返回并单击屏幕左上角的徽标。您将进入登录页面。尽管我在代码中明确执行了身份验证 cookie,但我可以在 Chrome 中看到过期日期正确的 cookie(称为 saveoncloudscookie)。
  • 没有发生。我使用的是 Firefox 81,并使用我的 gmail 帐户登录。
  • 您能否检查您在authConfig.CookieExpirationHours 获得的值是否正确。我的意思是以防万一。
  • @RajdeepDebnath 是的,它设置正确。我怀疑 Auth Cookie 是为 HTTPS 生成的,但是由于流量通过 HTTP(而不是 HTTPS)从 AWS ALB 流向 AWS EC2,因此忽略了 auth cookie。我通过在 VS 2019 中的本地计算机上运行该网站来复制此内容,然后使用 HTTP 登录,然后进入 Index/Home。用户未通过身份验证,因此我再次看到登录页面。如何使 cookie 对 https 和 http 都有效?

标签: .net-core asp.net-core-webapi http-status-code-401


【解决方案1】:

问题是发生了一个 EF Core 异常,它破坏了工作进程,因此应用程序必须重新启动并重新进行身份验证。这发生得如此无声无息,我只能通过在 Visual Studio 中将日志记录级别设置为“调试”并在“输出”窗口中读取每一行文本来找到它!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 2021-04-19
    • 2020-06-18
    相关资源
    最近更新 更多