.net-core - 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;
});
我对此进行了计时,似乎在四分钟内用户就退出了!
我错过了什么吗?
解决方案
问题是发生了一个 EF Core 异常,它破坏了工作进程,因此应用程序必须重新启动并重新进行身份验证。这发生得如此无声无息,我只能通过在 Visual Studio 中将日志记录级别设置为“调试”并在“输出”窗口中读取每一行文本来找到它!
推荐阅读
- java - 当部署为单独的 fat-jar 时,Vertx 服务在本地 JVM 上运行有限的数据集时不连续接受消息
- python - Django:我什么时候需要 __eq__ 方法?
- reactjs - 我无法连接服务器
- c++ - C++ Qt5.11 错误:“C2661:没有重载函数需要 3 个参数”
- jsf - 从 template.xhtml 调用 servlet /logout
- java - CoordinatorLayout + CollapsingToolbarLayout 向上滚动时未设置工具栏
- android - 我用sqlite修改了.db,覆盖了Android应用程序中的原始文件,现在应用程序无法启动
- php - 如何防止在 Laravel 中访问具有 3 种类型用户的另一个页面
- scala - 如何获取DataFrame列中多个数组中对应项的最大值?
- node.js - 使用 Chai 和 Mocha 对猫鼬模型进行单元测试