首页 > 解决方案 > ASP.NET Core MVC 3.1 在短时间内注销

问题描述

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

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

在 Startup.cs 中,我保留了 cookie 并给它起了一个自定义名称“saveoncloudscookie”。

然而,在登录后大约 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;

            });

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

我错过了什么吗?

标签: .net-coreasp.net-core-webapihttp-status-code-401

解决方案


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


推荐阅读